我正在对此进行测试,看来如果您更改 内的值didSet
,则不会再次调用didSet
.
var x: Int = 0 {
didSet {
if x == 9 { x = 10 }
}
}
我可以依靠这个吗?它是否记录在某处?我在Swift Programming Language文档中没有看到它。
我正在对此进行测试,看来如果您更改 内的值didSet
,则不会再次调用didSet
.
var x: Int = 0 {
didSet {
if x == 9 { x = 10 }
}
}
我可以依靠这个吗?它是否记录在某处?我在Swift Programming Language文档中没有看到它。
我还认为,这是不可能的(也许它不在 Swift 2 中),但我对其进行了测试并找到了一个Apple 使用它的示例。(在“查询和设置类型属性”处)
struct AudioChannel {
static let thresholdLevel = 10
static var maxInputLevelForAllChannels = 0
var currentLevel: Int = 0 {
didSet {
if currentLevel > AudioChannel.thresholdLevel {
// cap the new audio level to the threshold level
currentLevel = AudioChannel.thresholdLevel
}
if currentLevel > AudioChannel.maxInputLevelForAllChannels {
// store this as the new overall maximum input level
AudioChannel.maxInputLevelForAllChannels = currentLevel
}
}
}
}
在这段代码下面,有以下注释:
在这两项检查的第一项中,didSet 观察者将 currentLevel 设置为不同的值。但是,这不会导致再次调用观察者。
来自Apple docs(强调我的):
类似地,如果你实现了一个 didSet 观察者,它会传递一个包含旧属性值的常量参数。您可以命名参数或使用默认参数名称 oldValue。如果您在其自己的 didSet 观察者中为属性分配一个值,您分配的新值将替换刚刚设置的值。
所以,在 didSet 中赋值是正式的,不会触发无限递归。
它可以正常工作,但从 API 使用者的角度来看,这似乎是一个非常糟糕的主意。
它不会递归,我怀疑它可能的方式,所以至少这很好。
我能想到一些情况,在这种情况下,setter 更改我正在设置的内容是可以接受的。一个这样的示例可能是一个设置为角度的变量,该角度自动归一化为[0, 2π]
。