【问题标题】:Why is it not possible to define property observers for computed propertys?为什么不能为计算属性定义属性观察者?
【发布时间】:2016-02-22 15:36:50
【问题描述】:

我目前正在玩 swift,但有一件事我不明白。

我们看看下面的非编译代码sn-p

class A {
    var test : String  {
        get {
            return "foo"
        }

        set {
            self.test = newValue
        }

        willSet {

        }

        didSet {

        }
    }
}

由于某种原因,编译器在抱怨。所以我无法实现所有这些:get 和 set、didSet 和 willSet。我认为观察计算属性可能是不可能的。

所以我又玩了一点,然后我发现子类可以覆盖计算属性的属性观察者。 什么情况? 这对我来说没有意义

import UIKit

class A {
    var test : String  {
        get {
            return "name"
        }

        set {
            self.test = newValue
        }
    }
}

class B : A {
    override var test : String {
        willSet {

        }

        didSet {

        }
    }
}

为什么我不能在第一个代码 sn-p 中添加属性观察者,但我可以在子类中覆盖这些观察者?

【问题讨论】:

    标签: swift


    【解决方案1】:

    在第一个代码中,您不需要观察者,因为您已经在编写设置属性的代码 (set)。因此,如果您想在设置属性之前/之后做某事,您可以在 setter 处理程序中直接执行 (set):

    class A {
        var test : String  {
            get {
                return "foo"
            }
            set {
                // will set
                self.test = newValue
                // did set
            }
        }
    }
    

    因此,根据一种奥卡姆剃刀原理,有单独的 setter 观察者是多余且不必要的:您是 setter,因此无需观察自己。

    另一方面,在你的子类覆盖中,如果你没有提供一个全新的计算属性,那么设置是在你背后进行的,所以作为补偿,你可以将集合观察注入到过程。

    【讨论】:

    【解决方案2】:

    “您不需要为未覆盖的计算属性定义属性观察器,因为您可以在计算属性的 setter 中观察并响应对其值的更改。”

    摘自:Apple Inc.“Swift 编程语言 (Swift 2.1)。”电子书。 https://itunes.apple.com/cn/book/swift-programming-language/id881256329?l=en&mt=11

    【讨论】:

      猜你喜欢
      • 2020-03-03
      • 2015-06-15
      • 2016-04-22
      • 2017-04-25
      • 1970-01-01
      • 2021-12-19
      • 2015-04-28
      • 2020-11-20
      • 1970-01-01
      相关资源
      最近更新 更多