2014-09-02 28 views
11

Buduję aplikację na iOS w Swift i rysuję na przykładowym projekcie Apple dostarczonym przez Lister.Wywołanie super.init() w inicjatorze podklasy NSObject w Swift

Lister używa dwóch obiektów modelu: List i ListItem. Zauważyłem, że oba nie wywołują super.init() w swoich inicjalizatorach, nawet jeśli podklasują NSObject.

Jednak w wersji Listera programu Objective-C oba obiekty modelu (AAPLList i AAPLListItem) wywołują [super init].

Swift Programming Language wyraźnie stwierdza, że ​​„wyznaczone inicjalizatory musi zadzwonić do wyznaczonego inicjator z ich bezpośrednim nadrzędnej.” (Reguła 1 initializer Chaining w inicjalizacji)

Co tu się dzieje? Dlaczego jest to wyjątek i jeśli nie powinieneś zawsze wywoływać super.init() w podklasie, jakie zasady obowiązują?

Odpowiedz

12

Mimo że nie mogę znaleźć miejsca w dokumentacji, gdzie jest to opisane, to co się dzieje, jest to, że domyślny inicjator klasy nadrzędnej jest wywoływany na końcu inicjalizatora podklasy, jeśli jest to jedyny inicjator superklasy, i nie został wyraźnie wywołany.

NSObject tylko ma domyślny initialiser (init()); widać, że nadklasą initialiser nazywa się w końcu initialiser podklasy próbując odwołać siebie (np. println(self)) w konstruktorze, który nie wymaga super.init(): Nie wolno robić to dlatego, że klasa nie jest w pełni zainicjowany w tym punkcie.

Jeśli chcesz użyć siebie gdzieś w konstruktorze, obiekt musi być w pełni zbudowana w tym miejscu, więc trzeba zadzwonić super.init() ręcznie wcześniej.