मैं दिए गए प्रोटोकॉल के प्रकार पर एक स्विच स्टेटमेंट बनाना चाहता हूं। मान लें कि मेरे पास है:

protocol A {}

struct SA: A {}
struct SB: A {}

let aself: A.Type = SA.self
let bself: A.Type = SB.self

switch aself {
case is SA:
    break
default:
    break
}

क्या मैं किसी तरह इस तरह के स्विच को काम कर सकता हूँ? यह मुझे चेतावनी देता है कि ऐसा रूपांतरण हमेशा विफल रहता है। क्या यह किसी तरह किया जा सकता है?

2
Damian Dudycz 10 सितंबर 2018, 19:14

2 जवाब

सबसे बढ़िया उत्तर

आप कुछ इस तरह लिख सकते हैं:

switch aself {
case is SA.Type:
    print("is SA.Type")
default:
    print("Unknown type")
}

या यह:

switch ObjectIdentifier(aself) {
case ObjectIdentifier(SA.self):
    print("is SA.Type")
default:
    print("Unknown type")
}

(जैसा कि मैंने नीचे टिप्पणी की है, उपवर्गों के लिए अलग-अलग व्यवहार की व्याख्या करने वाला कुछ कोड।)

class CA: A {}
class CAA: CA {}

let caaself: A.Type = CAA.self

switch caaself {
case is CA.Type:
    print("is CA.Type") //->is CA.Type
default:
    print("Unknown type")
}

switch ObjectIdentifier(caaself) {
case ObjectIdentifier(CA.self):
    print("is CA.Type")
default:
    print("Unknown type") //->Unknown type
}

जब आप अपने प्रकार के मिलान में उपवर्गों को बाहर करना चाहते हैं तो आपको ObjectIdentifier का उपयोग करने की आवश्यकता हो सकती है। (और भी तरीके हो सकते हैं, लेकिन मैं अब किसी के बारे में नहीं सोचता।)

5
OOPer 10 सितंबर 2018, 19:45

मुझे लगता है कि आप कास्ट प्रकार मान का भी उपयोग करना चाहेंगे, इस स्थिति में आप कुछ पैटर्न मिलान का उपयोग कर सकते हैं:

switch aself {
case let a as SA.Type:
    break
default:
    break
}

यदि आप कास्ट मूल्य का उपयोग नहीं करना चाहते हैं:

switch aself {
case let _ as SA.Type:
    break
default:
    break
}
2
Cristik 10 सितंबर 2018, 19:23