Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling super.init() in initializer of NSObject subclass in Swift

I'm building an iOS app in Swift and drawing on the Lister sample project Apple provides.

Lister uses two model objects: List and ListItem. I found that both of them do not call super.init() in their initializers even though they subclass NSObject.

However, in the Objective-C version of Lister, both model objects (AAPLList and AAPLListItem) do call [super init].

The Swift Programming Language clearly states that “designated initializers must call a designated initializer from their immediate superclass.” (Rule 1 of Initializer Chaining in Initialization)

What's going on here? Why is this an exception and if you shouldn't always call super.init() in a subclass, what rules do apply?

like image 649
sdduursma Avatar asked Sep 02 '14 18:09

sdduursma


People also ask

Do you need to call super init in Swift?

The Swift Programming Language: If a subclass initializer performs no customization in phase 2 of the initialization process, and the superclass has a zero-argument designated initializer, you can omit a call to super. init() after assigning values to all of the subclass's stored properties.

Why we use super init in Swift?

This is called class inheritance or subclassing, the class you inherit from is called the “parent” or “super” class, and the new class is called the “child” class. For safety reasons, Swift always makes you call super. init() from child classes – just in case the parent class does some important work when it's created.

What is the use of NSObject in Swift?

Subclassing NSObject in Swift gets you Objective-C runtime flexibility but also Objective-C performance. Avoiding NSObject can improve performance if you don't need Objective-C's flexibility.


1 Answers

Even though I can't find a place in the documentation where this is described, what happens is that the default superclass initialiser is called at the end of the subclass initialiser if that is the only initialiser of the superclass, and it wasn't called explicitly.

NSObject only has the default initialiser (init()); you can see that the superclass initialiser is called at the end of the subclass initialiser by attempting to reference self (eg. println(self)) in a constructor that does not call super.init(): You are not allowed to do it because the class is not fully initialised at that point.

If you want to use self somewhere in the constructor, the object needs to be fully constructed at that point, so you need to call super.init() manually before then.

like image 190
jasamer Avatar answered Sep 28 '22 05:09

jasamer