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
。但这不会编译错误说:
Extensions may not contain stored properties
这是有道理的,因为协议不能强制属性为 stored
或 computed
。
这是否可以在不引入 class inheritance
的情况下完成?
换句话说,我可以观察到属性内部协议扩展的变化吗?
不,这是明确不允许的。见 Extension: Computed Properties:
Extensions can add new computed properties, but they cannot add stored properties, or add property observers to existing properties.
请记住,如果这是合法的,它会增加一些关于执行顺序的重要混淆。想象有几个扩展添加了 didSet
,而实际实现也有一个 didSet
。他们 运行 应该按什么顺序排列?这并不意味着它不可能实现,但如果我们实现了它可能会有些令人惊讶。
考虑以下因素:
protocol ViewControllable: class {
typealias VM: ViewModellable
var vm: VM! { get }
func bind()
}
extension ViewControllable {
var vm: VM! {
didSet {
bind()
}
}
}
我正在尝试观察 vm
属性 并在注入时调用 bind
。但这不会编译错误说:
Extensions may not contain stored properties
这是有道理的,因为协议不能强制属性为 stored
或 computed
。
这是否可以在不引入 class inheritance
的情况下完成?
换句话说,我可以观察到属性内部协议扩展的变化吗?
不,这是明确不允许的。见 Extension: Computed Properties:
Extensions can add new computed properties, but they cannot add stored properties, or add property observers to existing properties.
请记住,如果这是合法的,它会增加一些关于执行顺序的重要混淆。想象有几个扩展添加了 didSet
,而实际实现也有一个 didSet
。他们 运行 应该按什么顺序排列?这并不意味着它不可能实现,但如果我们实现了它可能会有些令人惊讶。