Ответ 1
См. "Наследование автоматического инициализатора" :
Правило 1 Если ваш подкласс не определяет какие-либо назначенные инициализаторы, он автоматически наследует все его инициализаторы, назначенные суперклассам.
Правило 2 Если ваш подкласс обеспечивает реализацию всех его суперклассы, назначенные инициализаторы, либо путем наследования их в соответствии с правило 1, или путем предоставления пользовательской реализации как части ее определение - тогда он автоматически наследует все суперклассы инициализаторы удобства.
В вашем примере подкласс B
не определяет никаких инициализаторов самостоятельно, поэтому он
наследует все инициализаторы от A
, включая требуемый инициализатор.
То же самое верно, если B
определяет только удобные инициализаторы
(теперь обновлено для Swift 2):
class B: A {
convenience init(str : String) {
self.init(num: Int(str)!)
}
func haveFun() {
print("Woo hoo!")
}
}
Но если подкласс определяет любой назначенный (= неудобный) инициализатор, то он не наследует инициализаторы суперкласса. В частности, требуется инициализатор не наследуется, поэтому это не скомпилируется:
class C: A {
init(str : String) {
super.init(num: Int(str)!)
}
func haveFun() {
print("Woo hoo!")
}
}
// error: 'required' initializer 'init(num:)' must be provided by subclass of 'A'
Если вы удалите метод required
from A
init, тогда класс C
компилируется также.