Использование констант в подклассах с множеством инициализаторов для переопределения является утомительным. Посмотрите на класс ниже, мне нужно дублировать код в обоих инициализаторах.Общий init при использовании констант
class Test : UIView {
let subview: UIView
override init(frame: CGRect) {
subview = UIView() // once
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
subview = UIView() // twice
super.init(coder: aDecoder)
}
}
Если я пытаюсь использовать общий инициализаторе тогда я получаю следующие ошибки (см комментарии)
override init(frame: CGRect) {
commonInit() // 1: Use of 'self' in method call 'commonInit' before super.init initializes self
super.init(frame: frame) // 2: Property 'self.subview' is not in initialized at super.init call
}
private func commonInit() {
subview = UIView() // 3: Cannot assign to 'subview' in 'self'
}
Он отлично работает, если я не использовать константу и определить подвид, как :
var subview: UIView?
И тогда, конечно, порядок переключатель инициализации, как это:
super.init(frame: frame)
commonInit()
Итак, мой вопрос: нет ли способа использовать обычный инициализатор для констант в Swift на данный момент?
EDIT: Я полностью забыл упомянуть, что борьба здесь заключается в том, что я не могу инициировать subview до того, как я в init, он инициирован на основе данных, которые неизвестны при объявлении константы.
дубликата http://stackoverflow.com/questions/ 24023412/how-to-implement-two-inits-with-same-content-without-code-duplication-in-swift? –
Нет, как я уже сказал, я знаю, как это сделать для var, я использую let – Johannes
См. Мой ответ ниже. Он позволяет правильно инициализировать значения на основе контекста. –