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