【问题标题】:Swift: Difference between KVO and willSet & didSet?Swift:KVO 和 willSet & didSet 的区别?
【发布时间】:2018-11-15 17:37:48
【问题描述】:

一段时间以来,我一直在使用 willSet 和 didSet 来处理变量。它用于在变量更改前后收到通知并执行一些操作。

我最近遇到了 KVO,它做类似的事情,但设置步骤更少。

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

【问题讨论】:

  • willSet 和 didSet 实际上是 KVO,它只是让 KVO 更易于使用的 swift 功能
  • @Tj3n 并非如此,KVO 需要 Obj-C 运行时来进行 ISA swizzling; willSet 和 didSet 只是作为 Swift 属性设置器的一部分调用的函数。因此,它们可以在没有 Obj-C 运行时的情况下使用(例如,在结构中、在 Obj-C 中不可表示的类属性上,以及更普遍地跨非 Apple 平台)。

标签: ios swift


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    Swift 的 willSet 和 didSet“观察者”本质上是在设置属性之前和之后调用的函数,并且必须在编译时写入属性的源代码。它们的用途与 KVO 截然不同。

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 2017-02-12
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多