Вызов super.init() в инициализаторе подкласса NSObject в Swift

Я создаю приложение iOS в Swift и опишу пример Lister, который предоставляет Apple.

Lister использует два объекта модели: List и ListItem. Я обнаружил, что оба они не вызывают super.init() в своих инициализаторах, хотя они подклассы NSObject.

Однако в версии Lister для Objective-C оба объекта модели (AAPLList и AAPLListItem) вызывают [super init].

Язык Swift Programming четко указывает, что "назначенные инициализаторы должны вызывать назначенный инициализатор из своего непосредственного суперкласса". (Правило 1 инициализации в инициализации)

Что здесь происходит? Почему это исключение, и если вы не должны всегда вызывать super.init() в подклассе, какие правила применяются?

Ответ 1

Несмотря на то, что я не могу найти место в документации, где это описано, происходит то, что инициализатор суперкласса по умолчанию вызывается в конце инициализатора подкласса, если это единственный инициализатор суперкласса, и это wasn 't явно.

NSObject имеет только инициализатор по умолчанию (init());, вы можете видеть, что инициализатор суперкласса вызывается в конце инициализатора подкласса, пытаясь ссылаться на self (например. println(self)) в конструкторе, который не вызывает super.init(): Вам не разрешено делать это, потому что класс не полностью инициализирован в этой точке.

Если вы хотите использовать self где-то в конструкторе, объект должен быть полностью сконструирован в этой точке, поэтому вам нужно вызвать super.init() вручную до этого.