2012-11-07 13 views
5

Dlaczego metoda [NSString stringWithFormat] zwraca typ id? Od nazwy oczekuję, że zwróci NSString, a nie ogólny wskaźnik. Inne klasy stosują się do tej "reguły". Na przykład [NSNumber numberWithInt] zwraca wartość NSNumber, a nie id.NSString stringWithFormat typ powrotu, dlaczego jest to "identyfikator"?

Myślę, że nie jest to nawet uzasadnione z faktu, że jest to coś w rodzaju metody fabrycznej.

+1

Do podklasy. 'NSMutableString' wymaga w tym przypadku rzutowania. –

+0

Tak, zgodzę się - możesz zrobić stepowanie, dlaczego tak jest, ale ostatecznie to nie ma sensu. –

Odpowiedz

6

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:@[]]; 
+0

Ok, nigdy nie myślałem, że mógłbym wywołać [NSMutableString stringWithFormat]. Zwykle zbudowałem pusty NSMutableString, a następnie dołączam formaty. Moje rozumienie hierarchii klas jest uprzedzone z doświadczenia Java, gdzie String nie jest super klasy StringBuilder. – giampaolo

+0

Zmienna wersja klasy zawsze jest podklasą konkretnego odpowiednika. Ma to sens w przypadku kakao, klasa zmienna jest identyczna z klasą konkretną, z kilkoma dzwonkami i gwizdkami dodanymi, aby umożliwić jej odczytywanie, zamiast tylko do odczytu :) – WDUK

+0

@WDUK jest wybredny, 'NSNumber' to klaster klasy, więc ma wiele podklas, po prostu są prywatne. –

5

Ponieważ jest to metoda statyczna w klasie NSString i zakłada się, że zwraca typ obiektu, na który jest wywoływany. Jest to również zależne od typu, ponieważ może pochodzić z NSMutableString.

Powiązane problemy