2015-06-10 10 views
21

स्विफ्ट 2.0 के रूप में ऐसा लगता है कि हम अनुमानित परिस्थितियों पर लागू सामान्य प्रकार के एक्सटेंशन के करीब आ सकते हैं।स्विफ्ट "जहां" ऐरे एक्सटेंशन

हालांकि हम अभी भी ऐसा नहीं कर सकते:

protocol Idable { 
    var id : String { get } 
} 

extension Array where T : Idable { 
    ... 
} 

... अब हम ऐसा कर सकते हैं:

extension Array { 
    func filterWithId<T where T : Idable>(id : String) -> [T] { 
    ... 
    } 
} 

... और स्विफ्ट व्याकरण की दृष्टि से यह स्वीकार करता है। हालांकि, मेरे जीवन के लिए मैं यह समझ नहीं सकता कि जब मैं उदाहरण फ़ंक्शन की सामग्री भरता हूं तो संकलक को खुश कैसे किया जाए। मान लीजिए मैं संभव के रूप में स्पष्ट रूप से थे:

extension Array { 
    func filterWithId<T where T : Idable>(id : String) -> [T] { 
     return self.filter { (item : T) -> Bool in 
      return item.id == id 
     } 
    } 
} 

... संकलक फिल्टर करने के लिए प्रदान की बंद को स्वीकार नहीं करेगा, 'शिकायत प्रकार का एक तर्क सूची के साथ

आह्वान नहीं किया जा सकता' फिल्टर ' ((टी) -> बूल) '

इसी तरह यदि आइटम को इडेबल के रूप में निर्दिष्ट किया गया है। किसी को भी कोई भाग्य था?

उत्तर

37
extension Array { 
    func filterWithId<T where T : Idable>(id : String) -> [T] { 
    ... 
    } 
} 

एक सामान्य विधि filterWithId() जहां सामान्य प्लेसहोल्डर TIdable होने के लिए प्रतिबंधित है परिभाषित करता है। लेकिन उस परिभाषा में स्थानीय प्लेसहोल्डर T प्रस्तुत किया गया है जो सरणी तत्व प्रकार T (और विधि के दायरे में छुपाता है) से पूरी तरह से असंबंधित है।

तो तुम निर्दिष्ट नहीं कि सरणी तत्वों Idable को पालन करना चाहिए है, और यही कारण है कि आप एक बंद जो तत्वों उम्मीद Idable होने के लिए साथ self.filter() { ... } फोन नहीं कर सकते हैं। , वैकल्पिक रूप से

extension Array where Element : Idable { 

    func filterWithId(id : String) -> [Element] { 
     return self.filter { (item) -> Bool in 
      return item.id == id 
     } 
    } 
} 

:

स्विफ्ट 2/Xcode 7 बीटा 2 के रूप में, आप जो टेम्पलेट (काफ़ी मिलती-जुलती जारी करने के लिए Array extension to remove object by value तुलना) के बारे में अधिक प्रतिबंधात्मक हैं एक सामान्य प्रकार पर विस्तार तरीकों को परिभाषित कर सकते

extension SequenceType where Generator.Element : Idable { 

    func filterWithId(id : String) -> [Generator.Element] { 
     return self.filter { (item) -> Bool in 
      return item.id == id 
     } 
    } 
} 

फिर filterWithId() सभी प्रकार 012 के अनुरूप करने के लिए उपलब्ध है: यदि आप एक प्रोटोकॉल विस्तार विधि परिभाषित कर सकते हैं(विशेष रूप से Array) यदि अनुक्रम तत्व प्रकार Idable के अनुरूप है।

स्विफ्ट 3 में इस

extension Sequence where Iterator.Element : Idable { 

    func filterWithId(id : String) -> [Iterator.Element] { 
     return self.filter { (item) -> Bool in 
      return item.id == id 
     } 
    } 
} 
+0

आह उस अर्थ सही समझ में आता है हो सकता है, सीखने के लिए धन्यवाद :) –

+0

@ yo.ian.g: आपका स्वागत है! –

+0

क्या गैर-प्रोटोकॉल प्रकारों के साथ ऐसा करने का कोई तरीका है, जैसे 'एक्सटेंशन ऐरे जहां Iterator.Element: CGRect'? –

संबंधित मुद्दे