协议扩展中的Swift属性观察者?

Dan*_*hin 21 swift swift2 protocol-extension

考虑以下:

protocol ViewControllable: class {
  typealias VM: ViewModellable
  var vm: VM! { get }
  func bind()
}

extension ViewControllable {
  var vm: VM! {
    didSet {
      bind()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试观察vm属性并bind在注入时调用它.但这不会编译错误说:

扩展名可能不包含存储的属性

这是有道理的,因为协议不能强制执行属性storedcomputed.

这可能在没有介绍的情况下完成class inheritance吗?

换句话说,我可以观察协议扩展内属性的变化吗?

Rob*_*ier 29

不,这是明确禁止的.请参阅扩展:计算属性:

扩展可以添加新的计算属性,但不能添加存储的属性,也不能将属性观察者添加到现有属性.

请记住,如果这是合法的,它会增加一些关于执行顺序的非平凡的混淆.想象一下,添加了几个扩展,didSet实际的实现也有一个didSet.他们应该以什么顺序进行?这并不意味着它不可能实现,但如果我们拥有它可能会有点令人惊讶.

  • 谢谢你的澄清.但我不同意它可能带来的**混乱**.许多其他编程语言通过使编译错误明确或从声明的顺序推断它们来处理这种钻石问题.例如,Scala在冲突时优先考虑在`extends`(`:`)类之后声明的`trait`(`protocol`). (3认同)