Подтвердить что ты не робот

Swift переопределяет переменные экземпляра

Я знаю, что этот ответ уже опубликован в какой-то другой форме здесь, но я хотел бы больше узнать об переопределении переменных экземпляра в swift.

Скажем, у меня есть этот код

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

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

Ok. Из того, что я читал, константа требует префикса переопределения. Другие ответы сказали, что я должен объявить сеттер и геттер? Зачем? Я действительно не забочусь об этих двух. Мне просто нужно заменить значение. Я не могу использовать переопределение init, потому что я наследую UIView, и это может быть довольно опасно (я думаю).

Любые предложения приветствуются.

4b9b3361

Ответ 1

Как вы говорите, вы не можете просто переопределить константу в подклассе (в конце концов, это константа). Ошибка, которую вы получаете, это "Невозможно переопределить хранимое свойство". Кажется, возможно переопределить var, однако, когда я изменяю let someVariable на var someVariable, я получаю "неоднозначное использование" someVariable "при доступе к нему в подклассе (примечание - то же самое происходит, Я использую override или нет).

Самое простое решение - использовать геттер. Это действительно функция, поэтому вы можете с радостью переопределить ее, для вас будет управляться переменная поддержки, а если вы не предоставите сеттер... она будет постоянной для каждого класса:

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