请考虑以下事项:
protocol ViewControllable: class {
typealias VM: ViewModellable
var vm: VM! { get }
func bind()
}
extension ViewControllable {
var vm: VM! {
didSet {
bind()
}
}
}
我试图观察vm
属性并在注入时调用bind
。但这并没有编译错误说:
扩展程序可能不包含存储的属性
这是有道理的,因为协议不能将属性强制为stored
或computed
。
这可以在不引入class inheritance
的情况下完成吗?
换句话说,我可以观察协议扩展内属性的变化吗?
答案 0 :(得分:28)
不,这是明确禁止的。见Extension: Computed Properties:
扩展可以添加新的计算属性,但不能添加存储的属性,也不能将属性观察器添加到现有属性。
请记住,如果这是合法的,它会增加一些关于执行顺序的非平凡的混淆。想象一下,有几个扩展添加了didSet
,实际的实现也有didSet
。他们应该订购什么样的订单?这并不意味着它不可能实现,但如果我们拥有它可能会有点令人惊讶。