正如你所说,你不能简单地在一个子类中重新定义一个常量(毕竟它是一个常量).出现的错误是"无法使用存储属性重写".似乎可以覆盖var
,但是,当我将let someVariable
改为var someVariable
时,当我在子类中访问它时,我得到了"模糊使用‘someVariable’"(注意——无论我是否使用override
,都会发生同样的事情).
最简单的解决方案是使用Getters .这实际上是一个函数,所以您可以愉快地重写它,支持变量将为您管理,如果您不提供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
正如 comments 员@user3633673所指出的,如果你有一个getter(而不是setter),你可以放弃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
... 当然,在Swift 5中,你可以放下return
:
class BaseView: UIView {
var someVariable: Int { 1 }
}
class ExtendedView: BaseView {
override var someVariable: Int { 2 }
}