2012-11-07 10 views
5

Perché il metodo [NSString stringWithFormat] restituisce un tipo id? Dal nome che mi aspetto restituisce un NSString, non un puntatore generico. Altre classi seguono questa "regola". Ad esempio [NSNumber numberWithInt] restituisce un NSNumber, non uno id.NSString stringWithFormat tipo restituito, perché è "id"?

Penso che non sia nemmeno giustificato dal fatto che sia qualcosa come un metodo di fabbrica.

+1

Per sottoclassi. 'NSMutableString' richiederebbe un cast in quel caso. –

+0

Sì, sarei d'accordo: puoi fare un tip tap sul perché è così com'è, ma alla fine non ha senso. –

risposta

6

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

Ok, non avrei mai pensato di chiamare [NSMutableString stringWithFormat]. Di solito ho creato una NSMutableString vuota e poi ho aggiunto i formati. La mia comprensione della gerarchia delle classi è distorta dall'esperienza Java in cui String non è una super classe di StringBuilder. – giampaolo

+0

La versione mutevole di una classe è sempre una sottoclasse della sua controparte concreta. Ha senso per Cocoa, la classe mutevole è identica a quella concreta, con alcune campane e fischietti aggiunti per consentirne la lettura, invece che di sola lettura :) – WDUK

+0

@WDUK essendo schizzinoso, 'NSNumber' è un cluster di classe, quindi ha molte sottoclassi, solo che sono private. –

5

Perché si tratta di un metodo statico sulla classe NSString e si presume che stia restituendo il tipo di oggetto richiamato. Ciò dipende anche dal tipo poiché questo può provenire da una NSMutableString.

Problemi correlati