2014-10-12 22 views
9

मुझे किसी फ़ंक्शन के पैरामीटर के रूप में एक इंटरफ़ेस पास करना होगा। इंटरफ़ेस जेनेरिक a.k.a का एक संबद्ध प्रकार है। मुझे ऐसा करने का अच्छा तरीका नहीं मिला।स्विफ्ट में पैरामीटर के रूप में संबंधित प्रकार (जेनेरिक प्रोटोकॉल) के साथ प्रोटोकॉल कैसे पास करें?

protocol IObserver : class { 
    typealias DelegateT 
    ... 
} 

class Observer: IObserver { 
    typealias DelegateT = IGeneralEventsDelegate // IGeneralEventsDelegate is a protocol 
    ... 
} 

func notify(observer: IObserver) { ... } // here I need a type for observer param 

मैंने पाया कि यह काम करेगा:: यहाँ मेरी कोड है

func notify<T: IObserver where T.DelegateT == IGeneralEventsDelegate>(observer: T) { ... } 

, लेकिन आने उस पर भी जटिल है। क्या होगा यदि मैं इस चरम को कक्षा चर में सहेजना चाहता हूं, तो क्या मुझे इस कार्य के कारण पूरे वर्ग को सामान्य बनाना चाहिए।

यह सच है कि मैं सी ++ डेवलपर हूं और मैं स्विफ्ट भाषा के लिए नया हूँ, लेकिन जिस तरह से चीजें किया जाता है अभी तक बहुत जटिल है और उपयोगकर्ता अमित्र रहे हैं ... या मैं भी मूर्ख हूँ :)

+0

में किया था मैं तो हर बार भी लगता है। असुविधा वास्तव में। सी ++ के संदर्भ में, मुझे लगता है कि स्विफ्ट का 'प्रोटोकॉल' 'अवधारणा 'जैसा दिखता है। और 'प्रोटोकॉल' के अनुरूप एक प्रकार का 'एक्सटेंशन' 'concept_map' जैसा ही है। ये सुविधाएं संकलन-समय बहुरूपता का एहसास करने के लिए उपयोगी हैं। हालांकि, हम कई मामलों में 'शुद्ध वर्चुअल क्लास' + 'एकाधिक विरासत' जैसे तंत्र चाहते हैं, जो रनटाइम पॉलीमोर्फिज्म को समझने के लिए जावा के 'इंटरफेस' से मेल खाता है। लेकिन स्विफ्ट में सामान्य प्रकार के लिए इनके लिए कोई तंत्र नहीं हो सकता है .. – findall

+0

इस पर मेरा संबंधित उत्तर देखें ---> http://stackoverflow.com/a/34995198/5389500 – eonist

उत्तर

5

यदि आप इसे सामान्य बनाने के लिए प्रोटोकॉल में typealias का उपयोग करते हैं, तो आप संबंधित प्रकार को हल किए जाने तक इसे एक चर प्रकार के रूप में उपयोग नहीं कर सकते हैं। आप शायद अनुभव किया है के रूप में, जुड़े प्रकार के साथ एक प्रोटोकॉल का उपयोग कर एक संकलन त्रुटि में एक चर (या समारोह पैरामीटर) परिणामों को परिभाषित करने के:

Protocol 'MyProtocol' can only be used as a generic constraint because it has Self os associated type requirements

इसका मतलब है कि आप एक ठोस प्रकार के रूप में उपयोग नहीं कर सकते।

तो केवल 2 तरीके मैं एक ठोस प्रकार के रूप में जुड़े प्रकार के साथ एक प्रोटोकॉल का उपयोग करने के बारे में पता कर रहा हूँ कर रहे हैं:

  • परोक्ष रूप से, एक वर्ग है कि यह लागू करता है बनाने के द्वारा। शायद आप स्पष्ट जुड़े प्रकार बनाने
  • करने के लिए योजना बनाई है नहीं क्या है कि आप अपने समारोह

भी देखें संबंधित जवाब https://stackoverflow.com/a/26271483/148357

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