2014-09-02 15 views
11

Ich baue eine iOS-App in Swift und zeichne auf das Lister Beispielprojekt von Apple.Aufruf von super.init() im Initialisierer der NSObject-Unterklasse in Swift

Lister verwendet zwei Modellobjekte: List und ListItem. Ich habe festgestellt, dass beide in ihren Initialisierern super.init() nicht aufrufen, obwohl sie NSObject ableiten. In der Objective-C-Version von Lister rufen beide Modellobjekte (AAPLList und AAPLListItem) jedoch [super init] auf.

Die Swift Programmiersprache eindeutig fest, dass „bezeichnet initializers einen designierten Initialisierer aus ihrer unmittelbaren übergeordneten Klasse aufrufen müssen.“ (Artikel 1 von Initializer Chaining in Initialisierung)

Was ist hier los? Warum ist dies eine Ausnahme, und wenn Sie nicht immer aufrufen sollten super.init() in einer Unterklasse, welche Regeln gelten?

Antwort

12

Obwohl ich keinen Platz in der Dokumentation finden kann, wo dies beschrieben wird, passiert, dass der Standard-Superklasseninitialisierer am Ende des Unterklasseninitialisierers aufgerufen wird, wenn dies der einzige Initialisierer der Oberklasse ist wurde nicht explizit aufgerufen.

NSObject hat nur die Standard-initialiser (init()); Sie, dass die übergeordnete Klasse initialiser wird selbst zu verweisen, indem versucht wird am Ende der Unterklasse initialiser genannt sehen können (zB. println(self)) in einem Konstruktor, der nicht super.init(): nicht nennen Sie sind nicht erlaubt zu tun es, weil die Klasse nicht vollständig an diesem Punkt initialisiert.

Wenn Sie im Konstruktor irgendwo selbst zu verwenden, muss das Objekt vollständig an dieser Stelle gebaut werden, so müssen Sie super.init() manuell, bevor dann rufen.

Verwandte Themen