swift - 覆盖属性观察者

标签 swift properties overriding didset

当我覆盖函数 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"

那么我应该如何用观察者覆盖属性以及如何防止旧值也被执行?

最佳答案

您可以覆盖属性的 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")
        }
    }
}

不过,这并不漂亮。

这是一个更好、更简单的解决方案:

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/

相关文章:

c# - 是否有特定原因在类中不允许使用同名属性和方法,但允许将其作为扩展方法使用?

java - 当子类在本地重写其中一些方法时,如何强制子类使用父方法?

css - 用更少的声明覆盖 CSS

ios - 比特币 : GoogleMaps framework not found issue

ios - 如何使用 KIF 自动 UIPickerView 选择特定项目?

properties - D:常量正确性——我做错了什么?

java - 如何使用 toString 和 getter 和 setter 方法

swift - 你如何在 Swift 中调用子类的委托(delegate)函数?

date - 如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

javascript - 根据同一类中的其他属性计算的 Javascript 类的属性