Lei parla NSNumber
, questo non ha alcun sottoclassi diretti, quindi è sicuro per numberWithInt:
per restituire un NSNumber*
NSString*
(e altre classi, come NSSet
) tipo di ritorno id
perché possono avere sottoclassi (NSMutableString
e NSMutableSet
rispettivamente), che erediteranno questo metodo. Di conseguenza, queste chiamate ereditate devono restituire un'istanza del tipo della sottoclasse e, a causa delle regole di denominazione dei metodi, non è possibile eseguire l'overload in base al tipo restituito da solo. In quanto tali, hanno bisogno di un tipo comune tra tutti, che è id
.
Aggiornamento: recenti sviluppi indicano che la parola chiave instancetype
è ora disponibile. Potresti aver notato molti riferimenti a id
ora sostituiti con instancetype
. Questa parola chiave fornisce un suggerimento al compilatore che il tipo di ritorno del metodo è la stessa classe del destinatario del metodo.
Per esempio (e sottolineo un esempio, questo non può essere il caso nel quadro reale):
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:@[]];
Per sottoclassi. 'NSMutableString' richiederebbe un cast in quel caso. –
Sì, sarei d'accordo: puoi fare un tip tap sul perché è così com'è, ma alla fine non ha senso. –