swift - Swift 中属性方法(set、get、didSet、willSet 等)的继承

标签 swift inheritance properties getter-setter

我的问题是如何处理属性方法的继承,例如 setgetdidSetwillSet ,...?

举个例子:我想重写 Swift 类中属性的 setter 方法。这是我想要实现的目标(这显然不起作用):

class A {
    var value: Int {get {...} set {...} }
}

class B: A {
    var value: Int {
        set(newValue) {
            // do some fancy stuff...
        }
    }
}

这也不起作用:

// in class B
override func setValue(newValue: Int) {
    // do some fancy stuff...
}

我们可以在 Swift 中做这样的事情:

class A {
    var _value: Int = 0
    var value: Int {
        get {
            return _value
        }
        set {
            _value = newValue
        }
    }
}

class B: A {
    override var value: Int {
        get {
            return _value
        }
        set {
            _value = newValue + 1
        }
    }
}

let a = A()
a.value = 1
print(a.value) // => 1

let b = B()
b.value = 1 
print(b.value) // => 2

这种方法不是很优雅,因为我还必须实现 getter 方法,这实际上是没有必要的,因为只有 setter 应该被重写。

最佳答案

你可以这样做:

class A {
    var value: Int = 0
}

class B: A {
    override var value: Int {
        get { return super.value }
        set {
            // Something fancy...
            super.value = newValue
        }
    }
}

虽然您仍然需要在 B 中实现 getter,但至少不需要 _value,这有助于保持类 A 的干净.

关于swift - Swift 中属性方法(set、get、didSet、willSet 等)的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32436030/

相关文章:

Swift 3 使用 Table View 显示 Parse 对象 - 如何限制显示的对象数量

ios - 如何告诉我的 imagePickerController 委托(delegate)我的自定义 UIButton 正在处理拍照

java - 避免在 Java 中重复导入 : Inherit imports?

javascript - 如何在 ES6 中无需使用 super 来扩展类?

c# - 如何为用户定义的按钮创建具有已知且固定值的属性?

ios - 展开 UITableViewCell UIImage

swift - 在 uisearchController 中设置取消按钮的操作

python - 设计异常继承的标准方法是什么?

c# - 使用反射在谓词中引用类的属性

c# - 如何在分配属性时自动处理数据?