2016-04-08 6 views
1

Этот код работает:Это показывает «требуется инициализатор инициализации должны быть предусмотрены в подклассе UIControl» Когда я переопределить инициализации (кадр: CGRect)

import UIKit 

class wheel: UIControl { 

} 

Но этот код не будет:

class wheel: UIControl { 
override init(frame: CGRect) { 
    super.init(frame: frame) 
} 

Он показывает ошибку «Требуется инициализатор init должен быть указан в подкласса из UIControl« когда я переопределяю init (frame: CGRect), но не init(coder aDecoder: NSCoder).

Почему я должен реализовать init(coder aDecoder: NSCoder)? И почему мне не нужно его реализовывать, если я не реализовал init(frame: CGRect)?

Я нашел аналогичный пост переполнением стека, но это не объясняет: Swift : Error: 'required' initializer 'init(coder:)' must be provided by subclass of 'UIView'

ответ

5

Look. Согласно Apple documentations Подклассы Swift по умолчанию не наследуют их инициализаторы суперкласса. Они наследуются только в определенных обстоятельствах, один из которых: Если ваш подкласс не определяет какие-либо назначенные инициализаторы, он автоматически наследует все его инициализаторы, назначенные суперклассам. Поэтому, если вы не используете init(frame: CGRect), все супер инициализаторы наследуются.

Также UIView использует протокол NSCoding, для которого требуется инициализатор init(coder:). Поэтому, если вы реализуете init(frame: CGRect), ваш класс больше не наследует супер инициализаторы. Таким образом, вы также должны выполнить эту функцию:

required init?(coder decoder: NSCoder) { 
    super.init?(coder: decoder) 
} 
+0

Отлично, спасибо большое! – allenlinli

+1

Хороший ответ. Но пример кода должен содержать 'init init' вместо' init'. –

 Смежные вопросы

  • Нет связанных вопросов^_^