Неудачный инициализатор в Xcode 6.1
У меня есть пользовательский UITableViewCel (ничего необычного), который отлично работает на Xcode 6.0.
Когда я пытаюсь скомпилировать его с Xcode 6.1, компилятор показывает следующую ошибку:
A non-failable initializer cannot chain to failable initializer 'init(style:reuseIdentifier:)' written with 'init?'
Вот код ячейки:
class MainTableViewCell: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setup()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
func setup() {<...>}
}
В качестве решения компилятор предлагает Propagate the failure with 'init?'
:
override init?(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setup()
}
Я немного смущен.
Можно ли разработать, что такое (non)failable initialiser
и как его следует использовать и переопределять?
Ответы
Ответ 1
С Swift 1.1 (в Xcode 6.1) Apple представила отказоустойчивые инициализаторы, то есть инициализаторы, которые могут возвращать nil
вместо экземпляра. Вы определяете неудачный инициализатор, помещая ?
после init
. Инициализатор, который вы пытаетесь переопределить, изменил свою подпись между Xcode 6.0 и 6.1:
// Xcode 6.0
init(style: UITableViewCellStyle, reuseIdentifier: String?)
// Xcode 6.1
init?(style: UITableViewCellStyle, reuseIdentifier: String?)
Итак, чтобы переопределить, вам нужно внести то же самое изменение в свой инициализатор и не забудьте обработать случай nil
(путем назначения необязательного) при создании ячейки таким образом.
Подробнее о отказоустойчивых инициализаторах в документации Apple.