Ios 从基类扩展委托
我有一个objc基类:Ios 从基类扩展委托,ios,objective-c,swift,delegates,extend,Ios,Objective C,Swift,Delegates,Extend,我有一个objc基类: @protocol BaseClassDelegate; @interface BaseClass : NSObject @property (nonatomic, weak) id <BaseClassDelegate> delegate; @end @protocol BaseClassDelegate <NSObject> -(void)baseDelegateMethod; @end @协议BaseClassDelegate;
@protocol BaseClassDelegate;
@interface BaseClass : NSObject
@property (nonatomic, weak) id <BaseClassDelegate> delegate;
@end
@protocol BaseClassDelegate <NSObject>
-(void)baseDelegateMethod;
@end
@协议BaseClassDelegate;
@接口基类:NSObject
@属性(非原子,弱)id委托;
@结束
@协议BaseClassDelegate
-(void)basedelegated方法;
@结束
我正在创建一个swift子类,我想在其中扩展我的委托
protocol SubClassDelegate : BaseClassDelegate {
func additionalSubClassDelegateMethod();
}
class SubClass: BaseClass {
@IBAction func onDoSomething(sender: AnyObject) {
delegate?.additionalSubClassDelegateMethod(); <--- No such method in 'delegate'
}
}
协议子类委托:BaseClassDelegate{
func additionalSubClassDelegateMethod();
}
类子类:基类{
@iAction func OnDosMething(发送方:AnyObject){
delegate?.additionalSubClassDelegateMethod();我要创建一个包装委托,使其在子类中成为正确的类型
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();
这里有一个更全面的例子说明如何做到这一点。感谢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!
}
}
谢谢。第二个选项起作用了,尽管第一个选项看起来更像委托,但产生了编译器错误w.r.t.重写属性和类型。是的,很抱歉,您无法重写属性以使其更特定于父类。我已更新了第一个示例。