2009-04-06 7 views
155

J'ai lu plusieurs articles sur la syntaxe de la méthode Objective-C mais je suppose que je ne comprends pas les noms multiples pour une méthode.Comment passer plusieurs paramètres en Objective-C?

Je suis en train de créer une méthode appelée getBusStops avec NSString et NSTimeInterval paramètres et un type de retour de NSMutableArray. Voilà comment je l'ai construit la méthode, mais il obtient évidemment des erreurs lors de 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 

Répondre

102

Objective-C n'a pas nommé les paramètres, donc tout sur le côté gauche de 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é de sorte qu'il peut être plus descriptif. Vous pouvez simplement nommer votre méthode

getBusStops: : 

mais cela ne vous en dit pas beaucoup sur le second paramètre.

137

Vous devez délimiter chaque nom de paramètre avec une « : » à tout le moins. Techniquement, le nom est facultatif, mais il est recommandé pour la lisibilité. Ainsi, vous pouvez écrire:

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

ou ce que vous suggéré:

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

+1: arguments de la fonction Objective-C sont en effet de position, non nommé, de sorte que l'étiquette est facultative et pour la consommation humaine. –

61

Oui; la syntaxe de la méthode Objective-C est similaire pour plusieurs raisons; l'un d'eux est tel qu'il est clair quels sont les paramètres que vous spécifiez. Par exemple, si vous ajoutez un objet à un NSMutableArray à un certain indice, vous le faites 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 spécifié indice.

En pratique, ajouter une chaîne "Hello, World!" à l'indice 5 d'un NSMutableArray appelé array serait 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, assurant que vous passez le paramètre objet premier, puis le paramètre index. Cela devient plus utile lors de l'utilisation de fonctions qui prennent un grand nombre d'arguments et réduit les erreurs lors du passage des arguments.

En outre, la convention de nommage de méthode est telle que Objective-C ne supporte pas la surcharge; Cependant, si vous voulez écrire une méthode qui fait le même travail, mais qui prend différents types de données, cela peut être accompli; prendre, par exemple, la classe NSNumber; 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 simplement surcharger la méthode numérique pour permettre à différents types de données être passé comme argument; Cependant, en Objective-C, cette syntaxe permet de mettre en œuvre plusieurs variantes de la même fonction, en changeant le nom de la méthode pour chaque variante de la fonction.

+0

sont les noms de paramètres requis lors de l'appel de méthode (envoi de message) si le nom de la fonction inclut des noms de paramètres? – Naveen

23

Le texte avant chaque paramètre est partie du nom de la méthode. De votre exemple, le nom de la méthode est réellement

-getBusStops:forTime: 

Chaque: 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: s. par exemple.

[getBusStops: arg1 forTime: arg2] 
+3

Je pense que vous avez oublié d'ajouter le nom de la méthode. –

4

pour créer méthode:

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

pour appeler la méthode:

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

moi:

(returnTypeOfSecontArgument) secondArgumentName ; 

comme dans OTH langues er nous utilisons syntaxe suivante vide add(int one, int second) mais beaucoup d'assigner des arguments à OBJ_c est différent comme décrit ci-dessus

Questions connexes