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

Неудачный инициализатор в 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 и как его следует использовать и переопределять?

4b9b3361

Ответ 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.