2014-09-02 31 views
11

Sto costruendo un'app per iOS in Swift e disegno sul progetto di esempio Lister fornito da Apple.Chiamare super.init() nell'inizializzatore della sottoclasse NSObject in Swift

Lister utilizza due oggetti modello: List e ListItem. Ho trovato che entrambi non chiamano nei loro inizializzatori anche se eseguono la sottoclasse di NSObject.

Tuttavia, nella versione Objective-C di Lister, entrambi gli oggetti del modello (AAPLList e AAPLListItem) chiamano [super init].

Il Swift linguaggio di programmazione afferma chiaramente che “inizializzatori designati devono chiamare un inizializzatore designato dalla loro immediata superclasse.” (Regola 1 di Initializer Chaining in inizializzazione)

Che cosa sta succedendo qui? Perché si tratta di un'eccezione e se non si dovrebbe sempre chiamare super.init() in una sottoclasse, quali regole si applicano?

risposta

12

Anche se non riesco a trovare un posto nella documentazione in cui è descritto, ciò che accade è che l'inizializzatore della superclasse predefinito viene chiamato alla fine dell'inizializzatore della sottoclasse se questo è l'unico inizializzatore della superclasse, e non è stato chiamato esplicitamente.

NSObject ha solo il default initialiser (init()); si può vedere che l'initialiser superclasse viene chiamato alla fine del initialiser sottoclasse tentando di fare riferimento a sé (ad es. println(self)) in un costruttore che non chiama super.init(): non ti è permesso di fare perché la classe non è completamente inizializzato in quel punto.

Se si desidera utilizzare auto da qualche parte nel costruttore, l'oggetto deve essere completamente costruita in quel punto, quindi è necessario chiamare super.init() manualmente prima di allora.