2014-11-12 4 views
8

L'unica differenza che posso vedere tra inizializzatori designati e convenienza è che il primo chiama necessariamente un init di super classe (se disponibile).Perché non possiamo aggiungere inizializzatori designati nelle estensioni in swift?

Non capisco quindi perché non è possibile aggiungere un init designato a una classe in un'estensione, mentre aggiungendo una comodità è OK.

Perché è così grave avere un init da un'estensione per chiamare un inizializzatore di super classe?

risposta

19

Ricordiamo cosa è un inizializzatore designato.

Un inizializzatore designato inizializza completamente tutte le proprietà introdotte da tale classe e chiede un adeguato superclasse inizializzatore per continuare il processo di inizializzazione il superclasse catena.

Estratto da: Apple Inc. “The Swift Programming Language.”

class ClassA { 
     private let propertyA: Int 

     init(propertyA: Int) { 
       self.propertyA = propertyA 
     } 
} 

class ClassB: ClassA { 
     private let propertyB: Int 

     init(propertyA: Int, propertyB: Int) { 
       self.propertyB = propertyB 
       super.init(propertyA: propertyA) 
     } 
} 

extension ClassB { 
     // If this was a designated initializer, you need to initialize propertyB before calling a superclass initializer. 
     // But propertyB is a private property that you can't access. 
     // If you don't have the source code of ClassB, you will not even know there is a property called propertyB. 
     // This is why we can't use extensions to add designated initializers. 
     init(propertyC: Int) { 
       ... 
     } 
}