斯威夫特:KVO和willSet& didSet?

时间:2017-11-16 10:33:47

标签: ios swift

我一直在使用willSet和didSet作为变量一段时间。它用于在变量更改之前和之后获得通知并执行某些操作。

我最近遇到过KVO,它做了类似的事情,但只需要设置更多的步骤。

  1. 这两种方法有什么区别吗?
  2. 一个人有什么优势吗?

3 个答案:

答案 0 :(得分:2)

KVO是客观C 的用于观察属性的方法,基于动态调度

didSet / willSet是纯 Swift 方法,而ObjC中不存在

从理论上讲,后者应该更有效,因为 Swift 试图在可能的情况下使用静态分配来提高性能。

仅当您需要与某些ObjC依赖项或旧代码兼容时,我才会使用ObjC方法。

答案 1 :(得分:1)

KVO使您可以实现常见的“观察者”模式。使用KVO,您可以在运行时将任意数量的观察者附加到属性,而无需修改要观察的属性的源代码。

Swift的willSetdidSet“观察者”本质上是在设置属性前后调用的函数,必须在编译时将其写入属性的源代码中。它们的目的不同于KVO。

答案 2 :(得分:0)

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