2016-03-17 17 views
9

मैं घोंसला चाहते हैं मेरी कक्षा में एक प्रोटोकॉल इसलिए जैसे प्रतिनिधि पैटर्न लागू करने के लिए:स्विफ्ट प्रोटोकॉल एक वर्ग में नेस्ट

class MyViewController : UIViewController { 

    protocol Delegate { 
     func eventHappened() 
    } 

    var delegate:MyViewController.Delegate? 

    private func myFunc() { 
     delegate?.eventHappened() 
    } 
} 

लेकिन संकलक यह अनुमति नहीं दी जाएगी:

घोषणा है फ़ाइल गुंजाइश

पर ही मान्य मैं आसानी से यह वर्ग दायरे से बाहर MyViewControllerDelegate की घोषणा के द्वारा काम कर सकते हैं।
मेरा प्रश्न है ऐसी सीमा क्यों?

उत्तर

9

swift documenation

स्विफ्ट के अनुसार जिससे आप घोंसला प्रकार वे समर्थन की परिभाषा के भीतर समर्थन enumerations, वर्ग, और संरचनाओं आप, नेस्टेड प्रकार को परिभाषित करने के लिए सक्षम बनाता है।

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

-3

आपकी कक्षा के साथ एक अलग समस्या यह है कि delegate में ठोस प्रकार नहीं है। आप इसे MyViewController.Delegate? घोषित करने से दूर हो सकते हैं क्योंकि यह एक वैकल्पिक प्रकार है और .None हो सकता है। लेकिन यह सिर्फ आपके निजी myFunc मृत कोड बनाता है। केवल अंकन, कक्षाएं और संरचनाएं प्रोटोकॉल पर अनुरूप कर सकती हैं। उन तीनों में से कौन सा प्रकार delegate है?

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

class MyViewController: UIViewController { 

    protocol Delegate { 
    func eventHappened() 
    } 

    class Classy: Delegate { 
    func eventHappened() { 
     print("eventHappened") 
    } 
    } 

    var delegate: Classy? = Classy() 

    func myFunc() { 
    delegate?.eventHappened() 
    } 
} 

enter image description here

एक गूढ़ व्यायाम इस एक वर्ग कर सकता, लेकिन कोई भी हर एक वर्ग के अंदर एक प्रोटोकॉल घोषित करने के लिए प्रयास करना चाहिए क्या की सीमा से आगे बढ़ाने में दिलचस्प हो सकता है के रूप में। प्रोटोकॉल सभी प्रकार की रचना और संग्रह के बारे में हैं। जब आप एक ही बाहरी कक्षा में होने के लिए सीमित होते हैं तो कोई कोड पुन: उपयोग परिदृश्य नहीं होता है।

+0

इस वर्ग के उपयोगकर्ताओं द्वारा प्रतिनिधि प्रोटोकॉल लागू किए जाने का इरादा है। आप जो समस्या के रूप में वर्णन कर रहे हैं वह कोई समस्या नहीं है- यह एक आवश्यक सॉफ़्टवेयर डिज़ाइन पैटर्न है जो पूरे ऐप्पल के कोको और कोको टच फ्रेमवर्क में उपयोग किया जाता है। –

+0

आप कोकोआ _ (और एक्सटेंशन, ऑब्जेक्टिव-सी और स्विफ्ट द्वारा, प्रतिनिधियों को कोको के साथ मिलकर डिज़ाइन किया गया था और बाद में मुख्य रूप से कोको ऐप्स के लिए डिज़ाइन किया गया था) में एप्पल के [ कोको कोर योग्यता गाइड, प्रतिनिधि अनुभाग] (https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14-SW1)। –

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