【问题标题】:Why can't property observers be added to lazy properties?为什么不能将属性观察者添加到惰性属性中?
【发布时间】:2015-06-15 02:47:27
【问题描述】:

我看了一个关于 swift 基础的教程,并且有一条评论说不能将属性观察器添加到惰性属性中,但没有给出任何理由。为什么会这样?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    文档确实证实了这一点:

    除了惰性存储属性之外,您可以将属性观察器添加到您定义的任何存储属性中

    source

    但他们没有提供理由。

    我猜想属性观察者必须访问他们正在观察的属性才能将自己附加为观察者,尽管它不像你那样“感觉”。同样,这只是一个猜测,但如果我是正确的,那么显然拥有惰性属性是无关紧要的。惰性属性是在第一次访问时计算的,如果使用观察者访问该属性,那么它将立即计算,这首先完全违背了它的目的。

    【讨论】:

    • Swift 中的属性观察器机制与 KVO 观察器是完全独立且不同的。
    • @zneak,是的,我想我已经说清楚了,我将删除该示例以消除任何混淆。
    【解决方案2】:
    final class A {
        init() {
            print("!")
        }
    }
    
    final class B {
        lazy var a = A()
    }
    
    B().a = A()
    

    你只会得到一个“!”作为这里的输出。我的猜测是,在这里允许didSet 会使这种情况变得更加复杂。

    【讨论】:

      【解决方案3】:

      在 Swift 5.3 中,您现在可以使用惰性属性观察器。它使我们可以在不分配任何默认值的情况下声明属性。 (https://www.swiftbysundell.com/tips/lazy-property-observers/)

      lazy var totalSteps: Int = 0{
          willSet(newTotalSteps) {
              print("About to set totalSteps to \(newTotalSteps)")
          }
          didSet {
              if totalSteps > oldValue  {
                  print("Added \(totalSteps - oldValue) steps")
              }
          }
      } 
      

      【讨论】:

        猜你喜欢
        • 2020-03-03
        • 1970-01-01
        • 2021-12-19
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多