覆盖属性观察者

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

您可以覆盖setget财产的一部分,移动你的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,所以剩下的就是覆盖特别为此目的而创建的辅助功能.