Consider the following:
protocol ViewControllable: class {
typealias VM: ViewModellable
var vm: VM! { get }
func bind()
}
extension ViewControllable {
var vm: VM! {
didSet {
bind()
}
}
}
I'm trying to observe vm
property and call bind
whenever it is injected. But this doesn't compile with error saying:
Extensions may not contain stored properties
which makes sense since protocol cannot enforce properties to be stored
or computed
.
Is this possible to accomplish without introducing class inheritance
?
In other words, Can I observe the change of a property inside protocol extension?
No, this is explicitly disallowed. See Extension: Computed Properties:
Keep in mind that if this were legal, it would add some non-trivial confusion about order of execution. Imagine there were several extensions that added
didSet
, and the actual implementation also had adidSet
. What order should they run in? This doesn't mean it's impossible to implement, but it could be somewhat surprising if we had it.