के लिए में जहां मैं इस परिदृश्य:Typecasting और पाश
protocol A {}
protocol B: A {}
protocol C: A {}
let objects: [A] = ...
कैसे कर सकते हैं मैं सरणी के माध्यम से पाश और केवल वस्तुओं है कि प्रकार B
के हैं के लिए तर्क को अंजाम?
अभी, मैं कुछ इस तरह कर रहा हूँ:
for object in objects {
if let b = object as? B {
...
}
}
लेकिन अगर मैं इस अधिक अर्थपूर्ण और सुरुचिपूर्ण बनाने के लिए where
उपयोग कर सकते हैं मैं सोच रहा था।
for b in objects where b is B // <- compiles, but b is typed as A, not B
for b: B in objects where b is B // <- doesn't compile
for b in objects as! [B] where b is B // <- I get a warning that "is" will always be true
यदि 'प्रोटोकॉल बी' फ़ंक्शन 'टेस्ट() 'को परिभाषित करेगा, तो आप' ऑब्जेक्ट 'को' प्रोटोकॉलबी 'टाइप किए बिना' ऑब्जेक्ट 'पर अपने ऑब्जेक्ट में कॉल नहीं कर पाएंगे, क्योंकि' ऑब्जेक्ट 'प्रकार का है 'AnyObject', प्रकार 'प्रोटोकॉल बी' प्रकार नहीं है। – rid
अपडेट किए गए कोड में, यदि आप लूप में 'प्रिंट (object.test())' कॉल करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी ('AnyObject' के पास 'test()' नामक सदस्य नहीं है)। – rid
यह एक्सकोड 7 में बिल्कुल ठीक काम करता है। 'प्रिंट (ऑब्जेक्ट) 'सहित। यह केवल टिप्पणी की गई थी क्योंकि यह एक उदाहरण था – simons