Swift覆盖实例变量

时间:2014-10-04 02:01:12

标签: ios class variables inheritance swift

我知道这个答案已经在这里以其他形式发布了,但是我想了解更多关于在swift中覆盖实例变量的内容。

假设我有这段代码

class BaseView:UIView{
 let someVariable:Int = 1
 // do some work with someVariable
}

class ExtendedView:BaseView{
 let someVariable:Int = 2
}

确定。从我读到的,常量需要一个覆盖前缀。其他答案说我应该宣布二传手和吸气剂?为什么?我真的不在乎那两个。我只需要替换值。我不能真正使用init覆盖,因为我继承自UIView,这可能是非常危险的(我认为)。

欢迎任何建议。

1 个答案:

答案 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