[英]Swift: Difference between KVO and willSet & didSet?
我一直在使用willSet和didSet為變量做了一段時間。 它用於在變量更改之前和之后獲得通知並執行某些操作。
我最近遇到了KVO,它做了類似的事情,但只需要設置更多的步驟。
KVO是Objective C方法,用於觀察屬性是基於動態調度
雖然didSet / willSet是ObjC中不存在的純Swift方法
理論上后者應該更有效率,因為Swift試圖在可能的情況下使用靜態調度來提高性能。
只有在需要與某些ObjC依賴項或遺留代碼兼容時,我才會使用ObjC方法。
KVO允許您實現常見的“觀察者”模式。 使用KVO,您可以在運行時將任意數量的觀察者附加到屬性,而無需修改您正在觀察的屬性的源代碼。
Swift的willSet
和didSet
“觀察者”本質上是在設置屬性之前和之后調用的函數,並且必須在編譯時寫入屬性的源代碼。 他們的目的與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.