我知道这个答案已经在这里以其他形式发布了,但是我想了解更多关于在swift中覆盖实例变量的内容。
假设我有这段代码
class BaseView:UIView{
let someVariable:Int = 1
// do some work with someVariable
}
class ExtendedView:BaseView{
let someVariable:Int = 2
}
确定。从我读到的,常量需要一个覆盖前缀。其他答案说我应该宣布二传手和吸气剂?为什么?我真的不在乎那两个。我只需要替换值。我不能真正使用init
覆盖,因为我继承自UIView,这可能是非常危险的(我认为)。
欢迎任何建议。
答案 0 :(得分:59)
正如你所说,你不能简单地重新定义一个子类中的常量(毕竟它是一个常量)。您得到的错误是"无法覆盖存储的属性"。看起来似乎可以覆盖var
,但是,当我将let someVariable
更改为var someVariable
时,我会模糊地使用' someVariable'& #34;当我在子类中访问它时(注意 - 无论我是否使用override
都会发生同样的事情。)
最简单的解决方案是使用吸气剂。这真的是一个功能,所以你可以愉快地覆盖它,后备变量将为你管理,如果你不提供一个setter ......它将为每个类保持不变:
class BaseView: UIView {
var someVariable: Int { get { return 1 } }
// do some work with someVariable
}
class ExtendedView: BaseView {
override var someVariable: Int { get { return 2 } }
}
let a = BaseView()
a.someVariable // 1
let b = ExtendedView()
b.someVariable // 2
正如评论员@ user3633673指出的那样,如果你只有有一个吸气剂(而不是一个设定者),你可以放弃get
,但为了清晰起见,我把它留下了。没有它,这里也一样......
class BaseView: UIView {
var someVariable: Int { return 1 }
// do some work with someVariable
}
class ExtendedView: BaseView {
override var someVariable: Int { return 2 }
}
let a = BaseView()
a.someVariable // 1
let b = ExtendedView()
b.someVariable // 2