Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从基类扩展委托_Ios_Objective C_Swift_Delegates_Extend - Fatal编程技术网

Ios 从基类扩展委托

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;

我有一个objc基类:

@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.重写属性和类型。是的,很抱歉,您无法重写属性以使其更特定于父类。我已更新了第一个示例。