web-dev-qa-db-fra.com

Comment passer plusieurs paramètres dans Objective-C?

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 d'une méthode.

J'essaie de créer une méthode appelée getBusStops avec les paramètres NSString et NSTimeInterval ainsi qu'un type de retour de NSMutableArray. Voici comment j'ai construit la méthode mais il y a é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. Devrais-je faire la même chose avec quelque chose comme:

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

Objective-C n'a pas de paramètres nommés, donc tout ce qui se trouve du côté gauche des 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 en dit pas beaucoup sur le second paramètre.

111
Terry Wilcox

Vous devez au moins délimiter chaque nom de paramètre avec un ":". Techniquement, le nom est facultatif, mais il est recommandé pour la lisibilité. Pour que vous puissiez écrire:

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

ou ce que vous avez suggéré:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
152
E.M.

Oui; La syntaxe de la méthode Objective-C est la suivante pour plusieurs raisons. L’un d’eux est de faire en sorte que les paramètres que vous spécifiez soient clairs. Par exemple, si vous ajoutez un objet à un NSMutableArray à un certain index, utilisez la méthode suivante:

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

Cette méthode s'appelle 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'indice 5 d'une NSMutableArray appelée array serait appelée 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, en s'assurant que vous transmettez d'abord le paramètre d'objet, then le paramètre d'index. Cela devient plus utile lorsque vous utilisez des fonctions qui prennent un grand nombre d’arguments et réduit les erreurs lors de la transmission des arguments.

En outre, la convention de dénomination de méthode est telle car Objective-C ne prend pas en charge la surcharge; Toutefois, si vous souhaitez écrire une méthode qui effectue le même travail mais prend des types de données différents, vous pouvez le faire. prenons, par exemple, la classe NSNumber; cela a plusieurs méthodes de création d'objet, 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 transmis en tant qu'argument; toutefois, en Objective-C, cette syntaxe permet de mettre en œuvre plusieurs variantes différentes d'une même fonction, en modifiant le nom de la méthode pour chaque variante de la fonction.

68
Alex Rozanski

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

-getBusStops:forTime:

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

[getBusStops: arg1 forTime: arg2]
23
sigjuice

pour la méthode create:

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

pour appeler la méthode:

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