Comment passer plusieurs paramètres dans Objective-C?

178

J'ai lu plusieurs articles sur la syntaxe de la méthode Objective-C, mais je suppose que je ne comprends pas plusieurs noms pour une méthode.

J'essaye de créer une méthode appelée getBusStopsavec NSStringet des NSTimeIntervalparamètres et un type de retour de NSMutableArray. C'est ainsi que j'ai construit la méthode mais il y a évidemment des erreurs à l'exécution:

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

J'ai vu un autre exemple avec une méthode:

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

Je ne comprends pas pourquoi cette méthode a un nom de méthode pour chaque paramètre. Dois-je faire la même chose avec quelque chose comme:

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

Réponses:

120

Objective-C n'a pas de paramètres nommés, donc tout ce qui se trouve sur le côté gauche d'un deux-points fait partie du nom de la méthode. Par exemple,

getBusStops: forTime:

est le nom de la méthode. Le nom est divisé pour qu'il puisse être plus descriptif. Vous pouvez simplement nommer votre méthode

getBusStops: :

mais cela ne vous dit pas grand-chose sur le deuxième paramètre.

Terry Wilcox
la source
157

Vous devez au moins délimiter chaque nom de paramètre par un ":". Techniquement, le nom est facultatif, mais il est recommandé pour la lisibilité. Vous pourriez donc écrire:

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

ou ce que vous avez suggéré:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
EM
la source
15
+1: Les arguments de la fonction Objective-C sont en effet positionnels, non nommés, donc l'étiquette est facultative et destinée à la consommation humaine.
Jarret Hardie le
Je ne sais pas pourquoi "forTime" est préféré dans la signature, "timeInterval" peut être utilisé comme 2ème paramètre dans la fonction, non?
galactica
@galactica - Bien sûr, le nom peut être celui qui a le plus de sens pour vous. Cet exemple utilise la terminologie du PO par souci de cohérence.
EM du
2
Vous ne savez toujours pas à quoi forTimesert?
mrgloom du
71

Oui; la syntaxe de la méthode Objective-C est comme ceci pour plusieurs raisons; l'un de ceux-ci consiste à indiquer clairement quels sont les paramètres que vous spécifiez. Par exemple, si vous ajoutez un objet à un NSMutableArrayà un certain index, vous le feriez en utilisant la méthode:

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

Cette méthode est appelée insertObject:atIndex:et il est clair qu'un objet est inséré à un index spécifié.

En pratique, ajouter une chaîne "Hello, World!" à l'index 5 d'un NSMutableArrayappelé arrayserait appelé comme suit:

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

[array insertObject:obj atIndex:index];

Cela réduit également l'ambiguïté entre l'ordre des paramètres de la méthode, garantissant que vous passez d'abord le paramètre d'objet, puis le paramètre d'index. Cela devient plus utile lors de l'utilisation de fonctions qui acceptent un grand nombre d'arguments et réduit les erreurs lors de la transmission des arguments.

De plus, la convention de dénomination des méthodes est telle que Objective-C ne prend pas en charge la surcharge; cependant, si vous souhaitez écrire une méthode qui effectue le même travail, mais prend des types de données différents, cela peut être accompli; prenons, par exemple, la NSNumberclasse; cela a plusieurs méthodes de création d'objets, y compris:

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

Dans un langage tel que C ++, vous surchargeriez simplement la méthode number pour permettre à différents types de données d'être passés en argument; cependant, en Objective-C, cette syntaxe permet d'implémenter plusieurs variantes différentes de la même fonction, en changeant le nom de la méthode pour chaque variante de la fonction.

Alex Rozanski
la source
les noms de paramètres sont-ils requis lors de l'appel de méthode (envoi de message) si le nom de la fonction comprend des noms de paramètres?
Naveen
24

Le texte avant chaque paramètre fait partie du nom de la méthode. D'après votre exemple, le nom de la méthode est en fait

-getBusStops:forTime:

Chacun: représente un argument. Dans un appel de méthode, le nom de la méthode est divisé en: s et les arguments apparaissent après le: seg

[getBusStops: arg1 forTime: arg2]
Sigjuice
la source
3
Je pense que vous avez oublié d'ajouter le nom de la méthode.
Özgür
11

pour créer la méthode:

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

pour appeler la méthode:

[mymethods:self.contoCorrente withsecond:self.asecond];
VITROXMAN
la source
-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

moi:

(returnTypeOfSecontArgument) secondArgumentName ;

comme dans d'autres langages, nous utilisons la syntaxe suivante void add(int one, int second) mais la manière d'attribuer des arguments OBJ_cest différente de celle décrite ci-dessus

Chaudhry Umair
la source