【问题标题】:Extending a delegate from a base class从基类扩展委托
【发布时间】:2015-09-03 20:57:28
【问题描述】:

我有一个 objc 基类:

@protocol BaseClassDelegate;

@interface BaseClass : NSObject

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

@end

@protocol BaseClassDelegate <NSObject>

-(void)baseDelegateMethod;

@end

我正在创建一个 swift 子类,我想在其中扩展我的委托...

protocol SubClassDelegate : BaseClassDelegate {

    func additionalSubClassDelegateMethod();
}

class SubClass: BaseClass {

    @IBAction func onDoSomething(sender: AnyObject) {

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

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

【问题讨论】:

    标签: ios objective-c swift delegates extend


    【解决方案1】:

    我要么创建一个包装委托,使其成为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();
    

    【讨论】:

    • 谢谢。第二个选项有效,尽管第一个选项看起来更委托但产生了编译器错误 w.r.t.覆盖属性和类型。
    • 是的,抱歉,您不能重写属性以使其比父类更具体。我已经更新了第一个示例。
    【解决方案2】:

    这里有一个更全面的示例来说明如何执行此操作。感谢 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! 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2016-05-20
      • 1970-01-01
      相关资源
      最近更新 更多