2009-04-06 15 views
155

Ho letto molti post sulla sintassi del metodo Objective-C ma suppongo di non capire più nomi per un metodo.Come posso passare più parametri in Objective-C?

che sto cercando di creare un metodo chiamato getBusStops con NSString e NSTimeInterval parametri e un tipo di ritorno di NSMutableArray. Questo è come ho costruito il metodo ma ottiene, ovviamente, gli errori in fase di esecuzione:

- (NSMutableArray *)getBusStops:(NSString *)busStop 
           (NSTimeInterval *)timeInterval; 

ho visto un altro esempio con un metodo:

-(NSInteger)pickerView:(UIPickerView *)pickerView 
      numberOfRowsInComponent:(NSInteger)component 

Non capisco il motivo per cui questo metodo ha un nome di metodo per ogni parametro. Dovrei fare lo stesso con qualcosa di simile:

- (NSMutableArray *)getBusStops:(NSString *)busStop 
         forTime:(NSTimeInterval *)timeInterval 

risposta

102

Objective-C non ha parametri denominati, quindi tutto sul lato sinistro di un colon fa parte del nome del metodo. Ad esempio,

getBusStops: forTime: 

è il nome del metodo. Il nome è suddiviso in modo che possa essere più descrittivo. Potresti semplicemente chiamare il tuo metodo

getBusStops: : 

ma questo non ti dice molto sul secondo parametro.

137

È necessario delimitare ogni nome parametro con un ":" per lo meno. Tecnicamente il nome è facoltativo, ma è consigliato per la leggibilità. Così si potrebbe scrivere:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval; 

o quello che ha suggerito:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval; 
+13

+1: argomenti della funzione Objective-C sono infatti posizionale, non chiamato, con l'etichetta è opzionale e per il consumo umano. –

61

Sì; la sintassi del metodo Objective-C è simile per un paio di motivi; uno di questi è così che è chiaro quali sono i parametri che si sta specificando. Ad esempio, se si aggiunge un oggetto in un NSMutableArray ad un determinato indice, si farebbe usando il metodo:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index; 

Questo metodo è chiamato insertObject:atIndex: ed è chiaro che un oggetto viene inserito in un determinato indice.

In pratica, aggiungendo una stringa "Hello, World!" all'indice 5 di un NSMutableArray chiamato array sarebbe chiamato come segue:

NSString *obj = @"Hello, World!"; 
int index = 5; 

[array insertObject:obj atIndex:index]; 

Ciò riduce anche ambiguità tra l'ordine dei parametri di metodo, assicurando che si passa il parametro oggetto prima, poi parametro index. Ciò diventa più utile quando si utilizzano funzioni che richiedono un numero elevato di argomenti e riduce l'errore nel passare gli argomenti.

Inoltre, la convenzione di denominazione del metodo è tale perché Objective-C non supporta l'overloading; tuttavia, se vuoi scrivere un metodo che fa lo stesso lavoro, ma prende diversi tipi di dati, questo può essere realizzato; prendi, per esempio, la classe NSNumber; questo ha diversi metodi di creazione oggetto, tra cui:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

In un linguaggio come C++, si sarebbe semplicemente sovraccaricare il metodo di numero per consentire diversi tipi di dati a essere passato come argomento; tuttavia, in Objective-C, questa sintassi consente di implementare diverse varianti della stessa funzione, cambiando il nome del metodo per ciascuna variante della funzione.

+0

sono i nomi dei parametri richiesti durante la chiamata al metodo (invio messaggio) se il nome della funzione include i nomi dei parametri? – Naveen

23

Il testo prima di ogni parametro è parte del nome del metodo. Dal tuo esempio, il nome del metodo è in realtà

-getBusStops:forTime: 

Ciascuna: rappresenta un argomento. In una chiamata al metodo, il nome del metodo viene diviso in: s e gli argomenti appaiono dopo: s. per esempio.

[getBusStops: arg1 forTime: arg2] 
+3

Penso che ti sia dimenticato di aggiungere il nome del metodo. –

4

per creare metodo:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second { } 

per la chiamata del metodo:

[mymethod:self.contoCorrente withsecond:self.asecond]; 
-2
(int) add: (int) numberOne plus: (int) numberTwo ; 
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa 

me:

(returnTypeOfSecontArgument) secondArgumentName ; 

come in OTH er lingue usiamo seguente sintassi vuoto add(int one, int second) ma modo di assegnare argomenti a OBJ_c è diverso, come descritto sopra

Problemi correlati