Swift 为什么不能为计算属性定义属性观察者?

Swift 为什么不能为计算属性定义属性观察者?,swift,Swift,我现在正在和斯威夫特玩,有一件事我不明白 让我们看一下下面的非编译代码片段 class A { var test : String { get { return "foo" } set { self.test = newValue } willSet { } didSet { } } } im

我现在正在和斯威夫特玩,有一件事我不明白

让我们看一下下面的非编译代码片段

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

        set {
            self.test = newValue
        }

        willSet {

        }

        didSet {

        }
    }
}
import UIKit

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

        set {
            self.test = newValue
        }
    }
}

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

        }

        didSet {

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

所以我又多玩了一点,然后我发现子类可以覆盖计算属性的属性观察器。 怎么回事这对我来说没有意义

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

        set {
            self.test = newValue
        }

        willSet {

        }

        didSet {

        }
    }
}
import UIKit

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

        set {
            self.test = newValue
        }
    }
}

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

        }

        didSet {

        }
    }
}

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

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

因此,根据奥卡姆的剃刀原理,有单独的设定观察者是多余的,也没有必要的:你就是设定者,所以没有必要观察你自己

另一方面,在您的子类重写中,您没有提供一个全新的计算属性,设置是在您背后进行的,因为它是这样的,所以允许您将集合观察注入到流程中

您不需要为非重写的计算属性定义属性观察员,因为您可以在计算属性的setter中观察并响应对其值的更改


摘自:苹果公司《Swift编程语言(Swift 2.1)》,iBooks

我在书中关于二传观察家一节末尾的提示中也做了同样的观察,这里:好吧,如果我再多想一想,这对我来说完全是有意义的。