Możesz wspomnieć NSNumber
, to nie ma żadnych bezpośrednich podklasy, więc jest to bezpieczne dla numberWithInt:
zwrócić NSNumber*
NSString*
(i innych zajęć, takich jak NSSet
) Zwraca typ id
ponieważ mogą one mieć podklasy (NSMutableString
i NSMutableSet
), które odziedziczą tę metodę. Jako takie, te odziedziczone wywołania muszą zwracać instancję typu podklasy, a ze względu na zasady nazewnictwa metod nie można przeciążać w oparciu o sam typ powrotu. Jako takie, potrzebują wspólnego typu pomiędzy nimi wszystkimi, czyli id
.
Aktualizacja: Ostatnie wydarzenia oznaczają, że słowo kluczowe instancetype
jest już dostępne. Być może zauważyłeś, że wiele odniesień do id
zostało zastąpionych przez instancetype
. To słowo kluczowe zapewnia wskazówkę kompilatorowi, że typem zwracanej metody jest ta sama klasa odbiorcy metody.
na przykład (i stres przykład, to może mieć miejsce w ramach rzeczywistego)
NSArray:
- (instancetype)initWithArray:(NSArray*)array;
NSMutableArray:
// Inherits from NSArray
----
// Receiver is NSArray, method belongs in NSArray, returns an NSArray
[[NSArray alloc] initWithArray:@[]];
// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray
[[NSMutableArray alloc] initWithArray:@[]];
Do podklasy. 'NSMutableString' wymaga w tym przypadku rzutowania. –
Tak, zgodzę się - możesz zrobić stepowanie, dlaczego tak jest, ale ostatecznie to nie ma sensu. –