簡體   English   中英

Swift:KVO和willSet&didSet之間的區別?

[英]Swift: Difference between KVO and willSet & didSet?

我一直在使用willSet和didSet為變量做了一段時間。 它用於在變量更改之前和之后獲得通知並執行某些操作。

我最近遇到了KVO,它做了類似的事情,但只需要設置更多的步驟。

  1. 這兩種方法有什么區別嗎?
  2. 一個人比另一個人有任何優勢嗎?

KVO是Objective C方法,用於觀察屬性是基於動態調度

雖然didSet / willSet是ObjC中不存在的純Swift方法

理論上后者應該更有效率,因為Swift試圖在可能的情況下使用靜態調度來提高性能。

只有在需要與某些ObjC依賴項或遺留代碼兼容時,我才會使用ObjC方法。

KVO允許您實現常見的“觀察者”模式。 使用KVO,您可以在運行時將任意數量的觀察者附加到屬性,而無需修改您正在觀察的屬性的源代碼。

Swift的willSetdidSet “觀察者”本質上是在設置屬性之前和之后調用的函數,並且必須在編譯時寫入屬性的源代碼。 他們的目的與KVO截然不同。

KVO:它是一種允許一個對象觀察另一個對象的屬性的機制。 KVO允許在另一個對象的狀態發生變化時通知對象

willSet is called just before the value is stored.
didSet is called immediately after the new value is stored.
Example: 
class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

暫無
暫無

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

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