簡體   English   中英

Swift 中 didSet 和 willSet 是如何實現的

[英]How is didSet and willSet implemented in Swift

我試圖了解 Swift 中 willSet 和 didSet 的實現。 我想知道無論如何,當一個 var 聲明如下時,swift 是否依賴於 Obj-C KVO 機制。 注意:這是在 Cocoa 應用程序中使用的。 我必須將 var 聲明為 @objc dynamic 以便將此 var 綁定到 UI 上的控件。

@objc dynamic var someString: String? = nil {
        didSet {
            self.doSomething()
        }
    }

willSet/didSet@objc dynamic是兩個不同的東西。

  • willSet/didSet是獨立於 KVO 的輕量級屬性觀察器。
  • @objc dynamic將屬性暴露給 Objective-C KVO。 可可綁定需要它

不,他們不依賴 KVO。 為了證明這一點,讓我們看一下 didSet 和 willSet 是語法糖的代碼

var x = 0;

func setX(newX:Int):Int {
   willSet()
   x = newX
   didSet()
}

無需為該 Swift 編寫上述所有樣板,只需在幕后生成類似的東西即可。 如果它有助於將 = 視為簡單的集合函數,它位於等號左側的任何內容上。 如果我在屬性上調用 = 它只是在該屬性上調用 set 函數。 當我在屬性上調用 = 時,Swift 會調用 didSet 和 willSet,如上所示。 確切的實現可能看起來有點不同,但上面的代碼片段至少應該讓你相信用 KVO 實現屬性觀察器是不必要的,如果你深入挖掘 swift 的源代碼,你會發現 didSet 和 willSet 和計算屬性本身只是上述代碼的語法糖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM