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

Следующий код показывает ошибку сборки в Xcode 6.3 Beta 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")
  }
}

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

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

Обходной путь?

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

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


person Evgenii    schedule 16.03.2015    source источник


Ответы (3)


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

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

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

РЕДАКТИРОВАТЬ: По-видимому, в бета-версии 3 UIView не имеет инициализатора удобства, называемого как init, поэтому вам также нужно удалить ключевое слово override, теперь это назначенный инициализатор, поэтому вам нужно вызвать назначенный инициализатор суперкласса

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

РЕДАКТИРОВАТЬ: Хотя это работает, но я думаю, что лучший способ написать это:

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

Источник: Документация по Swift.

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

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

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

person ManicMonkOnMac    schedule 17.03.2015

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

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

person Nazmul Hasan    schedule 19.01.2017

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

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