繁体   English   中英

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

[英]Swift property observer in protocol extension?

考虑以下:

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

extension ViewControllable {
  var vm: VM! {
    didSet {
      bind()
    }
  }
}

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

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

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

这可以在不引入class inheritance情况下完成吗?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM