Swift override instance variables Swift override instance variables ios ios

Swift override instance variables


As you say, you cannot simply redefine a constant in a subclass (it is a constant, after all). The error you get is "Cannot override with a stored property". It does appear to be possible to override a var, however, when I change the let someVariable to var someVariable I get "ambiguous use of 'someVariable'" when I access it in the subclass (note - same thing happens whether I use override or not).

The simplest solution is to use a getter. This is really a function, so you can happily override it, the backing variable will be managed for you, and if you don't supply a setter ... it will be constant for each class:

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 // 1let b = ExtendedView()b.someVariable // 2

As commentator @user3633673 points out, if you only have a getter (and not a setter), you can drop the get, but I left it in for clarity of the principle. Here's the same without it...

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 // 1let b = ExtendedView()b.someVariable // 2

... and, of course, in Swift 5, you can drop the return:

class BaseView: UIView {    var someVariable: Int { 1 }}class ExtendedView: BaseView {    override var someVariable: Int { 2 }}