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