簡體   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