Ошибка сборки при попытке переопределить инициализатор в Xcode 6.3 Beta 3

Следующий код показывает ошибку сборки в Xcode 6.3 Бета 3. Код работает в Xcode 6.2 и Xcode 6.3 Beta 2.

class MyView: UIView {
  override init() {
    super.init()
    // Some init logic ...
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

Сообщение об ошибке

инициализатор не переопределяет назначенный инициализатор из своего суперкласса

Обход?

Существует возможное обходное решение для создания протокола с методами init, упомянутыми в примечаниях к выпуску Beta 3. Я не мог заставить его работать как с инициализаторами init, так и init(frame: CGRect).

Как я могу исправить эти ошибки сборки?

Ответы

Ответ 1

Назначенный инициализатор подкласса должен вызвать назначенный инициализатор Суперкласса. Инициализатор удобства может вызывать только другой инициализатор удобства или назначенный инициализатор этого класса.

init() является инициализатором удобства для UIView, если вы подклассифицируете UIView, вы должны вызвать его назначенный инициализатор, который является init (frame: frame)

override init() {
super.init(frame: frame)
// Some init logic ...
}

EDIT: очевидно, что в бета-версии 3 UIView не имеет инициализатора удобства, называемого init, поэтому вам нужно также удалить ключевое слово переопределения, теперь это назначенный инициализатор, поэтому вам нужно вызвать инициализатор, обозначенный суперклассом

init() {
super.init(frame: frame)
// Some init logic ...
}

EDIT: Хотя это работает, но я думаю, что лучший способ написать это:

convenience init() {
self.init(frame:CGRectZero)
}

Источник: Быстрая документация

Правило 1 Назначенный инициализатор должен вызывать назначенный инициализатор от его непосредственного суперкласса.

Правило 2 Инициализатор удобства должен вызвать другой инициализатор из тот же класс.

Правило 3 Инициализатор удобства должен в конечном итоге вызвать назначенный инициализатор.

Ответ 2

swift3 работает: @Andrea комментарий

попробуйте изменить super.init() в self.init()

Ответ 3

Дополнительным способом решения является предоставление аргумента по умолчанию для параметра кадра UIView

override init(frame: CGRect = CGRectZero) {
     super.init(frame: frame)
     // custom code
}