"प्रोटोकॉल" का उपयोग केवल एक सामान्य बाधा के रूप में किया जा सकता है, क्योंकि इसका स्व या संबद्ध प्रकार की आवश्यकताएं हैं "?


123

मैं स्विफ्ट में एक कस्टम प्रोटोकॉल पर एक शब्दकोश (वास्तव में हैशसेट ) बनाने की कोशिश कर रहा हूं , लेकिन यह मुझे शीर्षक में त्रुटि दे रहा है:

प्रोटोकॉल 'मायप्रोटोकॉल' का उपयोग केवल एक सामान्य बाधा के रूप में किया जा सकता है क्योंकि इसमें स्व या संबद्ध प्रकार की आवश्यकताएं हैं

और मैं न तो सिर बना सकता हूं और न ही पूंछ सकता हूं।

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes यह कोई डुप्लिकेट नहीं है। मैं पूछ रहा हूं कि त्रुटि संदेश वास्तव में क्या मतलब है। "स्व या संबद्ध प्रकार की आवश्यकता" क्या है?
देवियो 1

जवाबों:


90

प्रोटोकॉल प्रोटोकॉल से Observingविरासत में मिला है Hashable, जो बदले में प्रोटोकॉल से विरासत में मिला है Equatable। प्रोटोकॉल Equatableकी निम्नलिखित आवश्यकता है:

func ==(lhs: Self, rhs: Self) -> Bool

और एक प्रोटोकॉल जिसमें Selfकहीं इसके अंदर होता है वह एक प्रकार की बाधा को छोड़कर कहीं भी उपयोग नहीं किया जा सकता है।

यहाँ एक ऐसा ही सवाल है।


7
... क्योंकि संकलक को यह सुनिश्चित करना है कि यह दोनों तरफ एक ही प्रकार का है, लेकिन प्रोटोकॉल केवल यह सुनिश्चित करता है कि यह अनुबंध से मिलता है। समझा। फिर भी, ऐसा लगता है कि जरूरी नहीं कि Equatableइसका मतलब Equatableहै कि हैश कोड उत्पन्न करने के लिए कड़ाई से आवश्यक नहीं है।
devios1

4
अरे कोई प्रतीक्षा नहीं करता है, क्योंकि यह Dictionaryजानने में सक्षम होने की आवश्यकता है कि क्या दी गई वस्तु वास्तव में सही कुंजी है, क्योंकि दो अलग-अलग वस्तुओं के लिए एक ही हैश कोड उत्पन्न करना संभव है। हम्म, यह थोड़ा मुश्किल है। तो यहाँ समस्या वास्तव में है Equatable
devios1

4
एलेक्सिस गैलाघर शीर्षक द्वारा शानदार प्रस्तुति में 0:56 पर देखें: एसोसिएटेड प्रकार के साथ प्रोटोकॉल और उन्हें इस तरह (शायद) youtu.be/XWoNjiSPqI8
finneycanhelp

@finneycanhelp इस hel के लिए धन्यवाद। उत्तम विडियो!
devios1

11

इसे हल करने के लिए आप जेनरिक का उपयोग कर सकते हैं। इस उदाहरण पर विचार करें:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.