Een*_*dje 20 overriding properties swift didset
当我覆盖该函数时noise,该函数将被新函数替换.但是当我用观察者覆盖属性时,旧值和新值都会被执行.
在操场上:
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)")
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
var oldTrain = Train()
bulletTrain.noise("tjoek tjoek") // Prints: "A train does: tjoek tjoek"
Run Code Online (Sandbox Code Playgroud)
但是当我对一个观察者的财产做同样的事情时:
在操场上:
class Foo {
var something: Int! {
didSet {
println("vroom")
}
}
}
class Bar: Foo {
override var something: Int! {
didSet {
println("toot toot")
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
var foobar = Bar()
foobar.something = 3 // Prints: "vroom" & "toot toot"
Run Code Online (Sandbox Code Playgroud)
那么我应该如何用观察者覆盖属性以及如何防止旧值被执行呢?
Jea*_*nan 33
您可以覆盖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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这并不漂亮.
这是一个更好,更简单的解决方案:
class Foo {
var something: Int! {
didSet {
somethingWasSet()
}
}
func somethingWasSet() {
println("vroom")
}
}
class Bar: Foo {
override func somethingWasSet() {
println("toot toot")
}
}
Run Code Online (Sandbox Code Playgroud)
由于没有办法"覆盖" didSet,所以剩下的就是覆盖特别为此目的而创建的辅助功能.
| 归档时间: |
|
| 查看次数: |
10406 次 |
| 最近记录: |