Sie NSNumber
erwähnen, doch hat dies keine direkten Unterklassen hat, ist es so sicher für numberWithInt:
eine id
NSNumber*
NSString*
(und andere Klassen wie NSSet
) Rückgabetyp zurück, weil sie Unterklassen haben können (NSMutableString
und NSMutableSet
), die diese Methode erben wird. Daher müssen diese geerbten Aufrufe eine Instanz des Unterklasse-Typs zurückgeben, und aufgrund der Regeln der Methodennamensgebung können Sie basierend auf dem Rückgabetyp nicht überladen. Als solche benötigen sie einen gemeinsamen Typ zwischen allen, der id
ist.
Update: Neuere Entwicklungen bedeuten, dass das Schlüsselwort instancetype
jetzt verfügbar ist. Sie haben vielleicht bemerkt, dass viele Referenzen auf id
jetzt durch instancetype
ersetzt werden. Dieses Schlüsselwort gibt dem Compiler einen Hinweis, dass der Rückgabetyp der Methode dieselbe Klasse des Empfängers der Methode ist.
Zum Beispiel (und ich betone ein Beispiel, kann dies nicht der Fall, in dem eigentlichen Rahmen sein):
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:@[]];
Für Subklassifizieren. 'NSMutableString' würde in diesem Fall eine Umwandlung erfordern. –
Ja, ich stimme dir zu - du kannst einen Stepptanz machen, warum das so ist, aber letztendlich ergibt das keinen Sinn. –