2013-04-23 12 views
10

Kürzliche Objective-C-Compiler führen das Schlüsselwort 'instancetype' ein, das unter anderem für typisierte Sammlungen verwendet werden kann. . .Zweck des 'instancetype' Schlüsselwortes in 'objectWith' Methoden?

Ich sah einen anderen Zweck von instancetype, die es in "objectWith" Typ Methoden für Klassen verwendet. Zum Beispiel:

@interface Car 

    +(instancetype)carWithWheels:(NSArray*)wheels; 

@end 

Die Begründung war, dass der Compiler Typüberprüfung für initWith Methoden tun, aber nicht für ‚objectWith‘ Methoden.

Neben potenziell leichter zu geben, was ist der Vorteil anstelle des tatsächlichen Klassennamen ‚instanceType‘ zu verwenden? ZB:

@interface Car 

    +(Car*)carWithWheels:(NSArray*)wheels; 

@end 

Antwort

35

von instancetype verwenden, Sie sagen, dass Unterklassen ein Objekt der Unterklasse zurück.

Wenn wir

@interface Car 

    +(instancetype)carWithWheels1:(NSArray *)wheels; 
    +(Car *)carWithWheels2:(NSArray *)wheels; 

@end 

und

@interface VolkswagenBeetle : Car 

@end 

dann +[VolkswagenBeetle carWithWheels1:] garantiert zurück eine Instanz von VolkswagenBeetle haben; aber +[VolkswagenBeetle carWithWheels2:] könnte zurückgeben Buick, ein Caddilac oder ein ChittyChittyBangBang.

+0

danke. . . Wenn ich eine Methode für die Basisklasse verwende, erwarte ich im Allgemeinen, dass ich mich auf dieser Abstraktionsebene befinde. . Trotzdem kann ich jetzt sehen, wie das nützlich sein könnte. –

2

Sie können Car Unterklasse und noch von instanceType profitieren. Natürlich könnten Sie dies mit id erreichen, aber Sie würden die Typüberprüfung verlieren, die Sie von instantype gewinnen. Ich benutze es einfach überall, wo es Objekt der aktuellen Klasse zurückgeben soll (Unterklassen gibt das Objekt dieser Unterklasse zurück), speziell in Convenience-Methoden und so.

Es gibt eine große answer which could help.

Verwandte Themen