从基类扩展委托

我有一个objc基类:

@protocol BaseClassDelegate; @interface BaseClass : NSObject @property (nonatomic, weak) id <BaseClassDelegate> delegate; @end @protocol BaseClassDelegate <NSObject> -(void)baseDelegateMethod; @end 

我正在创build一个快速的子类,我想扩展我的委托…

 protocol SubClassDelegate : BaseClassDelegate { func additionalSubClassDelegateMethod(); } class SubClass: BaseClass { @IBAction func onDoSomething(sender: AnyObject) { delegate?.additionalSubClassDelegateMethod(); <--- No such method in 'delegate' } } 

现在,当我创build我的子类,我可以说它符合SubClassDelegate并设置委托。 问题是(当然),这个子类中不存在“委托”。 有没有办法告诉编译器将我的委托“扩展”到我的子类中? (或者我在这里疯了,错过了一些明显的东西)

我要么创build一个包装委托,使其在SubClass正确的types。

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

或者简单地将委托转换为预期的types:

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

这里有一个更全面的例子来说明如何做到这一点。 感谢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! } }