2015-06-18 18 views
5

मैं एक ObjC आधार वर्ग है से एक प्रतिनिधि का विस्तार:एक आधार वर्ग

@protocol BaseClassDelegate; 

@interface BaseClass : NSObject 

@property (nonatomic, weak) id <BaseClassDelegate> delegate; 

@end 

@protocol BaseClassDelegate <NSObject> 

-(void)baseDelegateMethod; 

@end 

मैं एक तेज उप-वर्ग, जिसमें मैं अपने प्रतिनिधि का विस्तार करना चाहते बनाने रहा हूँ ...

protocol SubClassDelegate : BaseClassDelegate { 

    func additionalSubClassDelegateMethod(); 
} 

class SubClass: BaseClass { 

    @IBAction func onDoSomething(sender: AnyObject) { 

     delegate?.additionalSubClassDelegateMethod(); <--- No such method in 'delegate' 
    } 
} 

अब, जब मैं अपना उप-वर्ग बनाता हूं, तो मैं कह सकता हूं कि यह सब क्लासडिलेगेट के अनुरूप है और प्रतिनिधि को सेट करता है। समस्या (ज़ाहिर है), यह है कि इस उप-वर्ग में 'प्रतिनिधि' मौजूद नहीं है। क्या मेरे प्रतिनिधि को मेरे उप-वर्ग में 'विस्तारित' करने के लिए संकलक को बताने का कोई तरीका है? (या मैं यहां पागल हो रहा हूं और कुछ स्पष्ट याद कर रहा हूं)

उत्तर

8

मैं या तो SubClass में सही प्रकार बनाने के लिए एक रैपर प्रतिनिधि बनाउंगा।

class SubClass: BaseClass { 
    var myDelegate: SubClassDelegate? { 
     get { return delegate as? SubClassDelegate } 
     set { delegate = newValue } 
    } 
    @IBAction func onDoSomething(sender: AnyObject) { 
     myDelegate?.additionalSubClassDelegateMethod(); 
    } 
} 

या बस की उम्मीद प्रकार के प्रतिनिधि डाली:

(delegate as? SubClassDelegate)?.additionalSubClassDelegateMethod(); 
+0

धन्यवाद। दूसरा विकल्प काम करता था हालांकि पहला विकल्प अधिक प्रतिनिधि दिखता था लेकिन संकलित त्रुटियों को उत्पन्न करता था w.r.t. संपत्ति और प्रकार को ओवरराइड करना। – Fittoburst

+1

हां, क्षमा करें, आप संपत्ति को ओवरराइड नहीं कर सकते हैं ताकि इसे मूल वर्ग के लिए अधिक विशिष्ट बनाया जा सके। मैंने पहला नमूना अपडेट किया है। – redent84

4

यहां ऐसा करने के लिए की एक अधिक व्यापक उदाहरण है। सही दिशा में मुझे इंगित करने के लिए redent84 के लिए धन्यवाद।

protocol SubclassDelegate: ClassDelegate { 
    func subclassDelegateMethod() 
} 

class Subclass: Class { 
    // here we assume that super.delegate property exists 
    @IBAction func buttonPressedOrSomeOtherTrigger() { 
     if let delegate: SubclassDelegate = self.delegate as? SubclassDelegate { 
      delegate.subclassDelegateMethod() 
     } 
    } 
} 

और फिर अपने कार्यान्वयन में:

extension SomeOtherClass: SubclassDelegate { 
    let someObject = Subclass() 
    someObject.delegate = self 

    func subclassDelegateMethod() { 
     // yay! 
    } 
} 
संबंधित मुद्दे