【问题标题】:Is it posible to create a default implementation of willSet on a class protocol是否可以在类协议上创建 will Set 的默认实现
【发布时间】:2015-12-02 19:37:34
【问题描述】:

我要做的是在对象被替换为我的服务对象的委托时通知它。我想知道是否有办法创建 willSet 的默认植入,这样我就不必为我创建的每个服务对象复制代码:

protocol BaseServiceDelegate: class {
    var delegate: BaseServiceDelegate? {get set}
    func servicesDelegateReferanceWasRemoved(service: BaseServiceDelegate)
}

extension BaseServiceDelegate {

    willSet(newValue){
        delegate?.servicesDelegateReferanceWasRemoved(self)
        self = newValue
    }
}

我真的不知道从哪里开始扩展的语法或者这是否可能。上述代码的错误出现在“willSet”行:“预期声明” 感谢您的时间 仍然不确定它是否可能,但我进行了一些编辑以确保您可以访问定义的委托对象

【问题讨论】:

  • 我认为您可能希望在此文档上多花一点时间以更好地理解协议及其扩展:developer.apple.com/library/prerelease/ios/documentation/Swift/…
  • 您是想让 [property observer] 为整个实例工作,还是只是创建一个默认函数以在属性观察器内执行?
  • 所以BaseServiceDelegate 有一个delegate 类型为BaseServiceDelegate 的属性? :)
  • 不可能,因为 self 是不可变的。
  • 嘿,不可变不是问题,因为这被定义为类协议,我的想法是,如果其他人可以将自己设置为您的代表,并且您在他们的参考被覆盖。这样做的正确方法可能是在基类而不是基协议中构建相同的功能

标签: ios swift protocols protocol-extension


【解决方案1】:

我能找到的最佳答案是定义一个基本协议:

protocol baseProtocol {
    func informOfAction()
}

然后在您希望也具有此功能的委托上实现此功能:

protocol childProtocol: baseProtocol {
    func somethingHappend()
    func somethingElseHappend()
}

并且当您创建符合 childProtocol 的对象时,将在那里设置自定义

var delegate: childProtocol? {
    willSet{
        delegate?.informOfAction()
    }
}

没有我想要的那么好,但也不算太差,在我的所有对象上都增加了 3 行,类似于“delegate”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多