Come faccio a passare più parametri in Objective-C?


178

Ho letto diversi post sulla sintassi del metodo Objective-C ma immagino di non capire più nomi per un metodo.

Sto cercando di creare un metodo chiamato getBusStopscon NSStringe NSTimeIntervalparametri e un tipo di ritorno di NSMutableArray. È così che ho costruito il metodo ma ovviamente ottiene 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 perché questo metodo abbia un nome metodo per ciascun parametro. Dovrei fare lo stesso con qualcosa del tipo:

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

Risposte:


120

Objective-C non ha parametri nominati, quindi tutto sul lato sinistro di due punti fa parte del nome del metodo. Per esempio,

getBusStops: forTime:

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

getBusStops: :

ma questo non ti dice molto sul secondo parametro.


157

Devi delimitare ogni nome di parametro con almeno un ":". Tecnicamente il nome è facoltativo, ma è consigliato per la leggibilità. Quindi potresti scrivere:

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

o cosa hai suggerito:

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

15
+1: gli argomenti della funzione Objective-C sono effettivamente posizionali, non nominati, quindi l'etichetta è facoltativa e per il consumo umano.
Jarret Hardie,

non sono sicuro del motivo per cui "forTime" è preferito nella firma, "timeInterval" può essere utilizzato come secondo parametro nella funzione, giusto?
galactica,

@galactica - Certo, il nome può essere quello che ha più senso per te. Questo esempio utilizza la terminologia del PO per coerenza.
EM,

2
Non so ancora cosa sia forTime serve?
MrGloom,

71

Sì; la sintassi del metodo Objective-C è così per un paio di ragioni; uno di questi è in modo che sia chiaro quali sono i parametri che si stanno specificando. Ad esempio, se stai aggiungendo un oggetto a un NSMutableArraydeterminato indice, lo faresti usando il metodo:

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

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

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

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

[array insertObject:obj atIndex:index];

Ciò riduce anche l'ambiguità tra l'ordine dei parametri del metodo, assicurando che prima passi il parametro oggetto, quindi il parametro indice. Ciò diventa più utile quando si utilizzano funzioni che accettano 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 il sovraccarico; tuttavia, se si desidera scrivere un metodo che fa lo stesso lavoro, ma accetta tipi di dati diversi, è possibile farlo; prendere, ad esempio, la NSNumberclasse; questo ha diversi metodi di creazione di oggetti, tra cui:

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

In un linguaggio come C ++, è sufficiente sovraccaricare il metodo numerico per consentire a diversi tipi di dati di essere passati come argomento; tuttavia, in Objective-C, questa sintassi consente di implementare diverse varianti della stessa funzione, modificando il nome del metodo per ciascuna variante della funzione.


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

24

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

-getBusStops:forTime:

Ciascuno: rappresenta un argomento. In una chiamata al metodo, il nome del metodo viene diviso in: se gli argomenti vengono visualizzati dopo: seg

[getBusStops: arg1 forTime: arg2]

3
Penso che ti sia dimenticato di aggiungere il nome del metodo.
Özgür,

11

per il metodo di creazione:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

per chiamare il metodo:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

me:

(returnTypeOfSecontArgument) secondArgumentName ;

come in altre lingue usiamo la seguente sintassi void add(int one, int second) ma il modo di assegnare argomenti in OBJ_cè diverso come descritto sopra

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.