我知道这个答案已经以其他形式发布了,但是我想了解更多关于在
@L_301_0@中覆盖实例变量的信息.
假设我有这个代码
class BaseView:UIView{ let someVariable:Int = 1 // do some work with someVariable } class ExtendedView:BaseView{ let someVariable:Int = 2 }
好.从我读的,常数需要一个覆盖前缀.其他答案说我应该宣布安抚者和吸烟者?为什么?我真的不在乎这两个.我只需要替换值.我不能真正使用init override,因为我从UIView继承,这可能是相当危险的(我想).
欢迎任何建议.
解决方法
正如你所说,你不能简单地重新定义一个子类中的常量(毕竟这是一个常量).你得到的错误是“不能覆盖存储的属性”.它似乎有可能覆盖一个var,但是,当我改变一些变量为var一些变量我得到“含糊的使用’someVariable’”当我访问它在子类(注意 – 同样的事情发生,无论我是否使用覆盖或不).
最初的顾问建议的最简单的解决方案是使用吸气剂.这真的是一个功能,所以你可以高兴地覆盖它,支持变量将为您管理,如果您不提供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