Swift重写实例variables

我知道这个答案已经在这里发布了一些其他的forms,但我想了解更多关于重写实例variables在迅速。

比方说,我有这个代码

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

好。 从我读的,常量需要一个覆盖前缀。 其他答案说我应该宣布setter和getter? 为什么? 我真的不在乎这两个。 我只需要replace的价值。 我不能真正使用init覆盖,因为我从UIViewinheritance,这可能是相当危险的(我认为)。

任何build议都欢迎。

正如你所说的,你不能简单地重新定义一个子类中的常量(毕竟它是一个常量)。 您收到的错误是“无法用存储的属性覆盖”。 它似乎有可能重写一个var ,但是,当我改变let someVariable var someVariable我得到“模糊使用someVariable'”,当我在子类中访问它(注意 – 同样的事情会发生,无论我使用override或不)。

最简单的解决scheme是使用一个getter。 这是一个真正的function,所以你可以高兴地覆盖它,支持variables将为你pipe理,如果你不提供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所指出的那样,如果你只有一个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