使用Observing Accessors创建存储属性时,我可以指定默认值。但是,当覆盖存储的属性及其访问者时,我无法指定默认值。
使用getter / setter的变量不能具有初始值。
这看起来很奇怪,因为这不是带有getter / setter的计算属性,而是存储属性上的一组Observing Accessors!
class FirstViewController: UIViewController {
internal var test: Float = 32.0 {
willSet {
}
didSet {
}
}
第一个视图控制器编译正常,存储属性初始化为32.0
class SecondViewController: FirstViewController {
override var test: Float = 64.0 {
willSet {
}
didSet {
}
}
第二个视图控制器不编译,因为'计算属性'被赋予初始值
答案 0 :(得分:5)
在swift中,您只能使用相同类型的计算属性(无法使用默认值)覆盖属性。在您的情况下,如果您希望在test
中覆盖SecondViewController
属性,则需要编写如下内容:
override var test: Float {
get {
return super.test
}
set {
super.test = newValue
}
}
并且无法直接覆盖didSet
/ willSet
观察员;你可以通过编写在观察者中调用的其他方法来实现这一点,然后重写它们:
FirstViewController:
internal var test: Float = 32.0 {
willSet {
test_WillSet(newValue)
}
didSet {
test_DidSet(oldValue)
}
}
func test_WillSet(newValue: Float) {}
func test_DidSet(oldValue: Float) {}
SecondViewController:
override func test_WillSet(newValue: Float) {
super.test_WillSet(newValue)
}
override func test_DidSet(oldValue: Float) {
super.test_DidSet(oldValue)
}
答案 1 :(得分:0)
我知道很久以前就已经问过这个问题,但我想出了一个略有不同的解决方案,它的工作原理完全符合您的要求。在第一个ViewController中具有一个属性,然后在继承的ViewController中覆盖它,并以didSet的形式在其上设置观察者。
因此,在FirstViewController中,您具有以下示例中的属性:
var myNumber: Double = 20.00
然后在从FirstViewController继承的SecondViewController中,按如下所示重写它:
override var myNumber: Double {
didSet {
//Here you can update UI or whatever you want to do once the property changes
//Print its value
print("Value of myNumber is : \(myNumber)")
}
我希望这对解决上述问题的人有所帮助,因为这是解决上述问题的简便方法。