当我覆盖函数 noise
时,该函数被新函数替换。但是当我用观察者重写一个属性时,旧值和新值都会被执行。
在 Playground 上:
class Vehicle {
func noise(sound: String) {
println("Vehicle sound sounds like \(sound)")
}
}
class Train: Vehicle {
override func noise(sound: String) {
println("A train does: \(sound)")
}
}
输出:
var oldTrain = Train()
bulletTrain.noise("tjoek tjoek") // Prints: "A train does: tjoek tjoek"
但是当我对观察者的属性(property)做同样的事情时:
在 Playground 上:
class Foo {
var something: Int! {
didSet {
println("vroom")
}
}
}
class Bar: Foo {
override var something: Int! {
didSet {
println("toot toot")
}
}
}
输出:
var foobar = Bar()
foobar.something = 3 // Prints: "vroom" & "toot toot"
那么我应该如何用观察者覆盖属性以及如何防止旧值也被执行?
最佳答案
您可以覆盖属性的 set
和 get
部分并将您的 println
移到那里。这样 Swift 就不会调用原始代码——除非你调用 super。
class Foo {
private var _something: Int!
var something: Int! {
get {
return _something
}
set {
_something = newValue
println("vroom")
}
}
}
class Bar: Foo {
override var something: Int! {
get {
return _something
}
set {
_something = newValue
println("toot toot")
}
}
}
不过,这并不漂亮。
这是一个更好、更简单的解决方案:
class Foo {
var something: Int! {
didSet {
somethingWasSet()
}
}
func somethingWasSet() {
println("vroom")
}
}
class Bar: Foo {
override func somethingWasSet() {
println("toot toot")
}
}
由于无法“覆盖”didSet
,剩下的就是覆盖专门为此目的创建的辅助函数。
关于swift - 覆盖属性观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29503482/