52 votes

Les arguments facultatifs en Objective-C 2.0 ?

En Objective-C 2.0, est-il possible de créer une méthode dont l'argument est facultatif ? C'est-à-dire qu'on peut avoir un appel de méthode comme ceci :

[aFraction print];

ainsi que ceci :

[aFraction print: someParameter];

dans le même programme.

Apple Langage de programmation Objective-C 2.0 Le guide oppose Obj-C à Python et semble dire que ce n'est pas autorisé. Je suis encore en train d'apprendre et je veux être sûr. Si cela est possible, alors quelle est la syntaxe, car mon deuxième exemple de code ne fonctionne pas.

Mise à jour : OK, je viens de créer deux méthodes, toutes deux nommées "print".

en-tête

-(void) print;
-(void) print: (BOOL) someSetting; 

mise en œuvre

-(void) print {
    [self print:0];
}

-(void) print: (BOOL) someSetting {
    BOOL sv;
    sv = someSetting;

    if ( sv ) {
        NSLog(@"cool stuff turned on");
    }
    else {
        NSLog(@"cool stuff turned off");
    }
}

les lignes de programme pertinentes

    ...
    printParamFlag = TRUE;

// no parameter
    [aCodeHolder print];

// single parameter
    [aCodeHolder print:printParamFlag];
    ...

Je n'arrive pas à croire que ça ait marché. Y a-t-il une raison pour laquelle je ne devrais pas faire ça ?

80voto

Georg Schölly Points 63123

Vous pouvez déclarer plusieurs méthodes :

- (void)print;
- (void)printWithParameter:(id)parameter;
- (void)printWithParameter:(id)parameter andColor:(NSColor *)color;

Dans l'implémentation, vous pouvez le faire :

- (void)print {
    [self printWithParameter:nil];
}

- (void)printWithParameter:(id)parameter {
    [self printWithParameter:nil andColor:[NSColor blackColor]];
}

Edit :

Veuillez ne pas utiliser print y print: en même temps. Tout d'abord, cela n'indique pas quel est le paramètre et ensuite, personne n'utilise l'Objective-C de cette façon. La plupart des frameworks ont des noms de méthodes très clairs, c'est une des choses qui rend l'Objective-C si facile à programmer. Un développeur normal n'attend pas ce genre de méthodes.

Il y a de meilleurs noms, par exemple :

- (void)printUsingBold:(BOOL)bold;
- (void)printHavingAllThatCoolStuffTurnedOn:(BOOL)coolStuff;

16voto

Chuck Points 138930

La façon dont vous l'avez fait est la bonne façon de le faire en Objective-C. Elle est largement utilisée dans Cocoa lui-même. Elle est largement utilisée dans Cocoa lui-même. Par exemple, certains initialisateurs de NSString :

– initWithFormat:  
– initWithFormat:arguments:  
– initWithFormat:locale:  
– initWithFormat:locale:arguments:

La raison pour laquelle cela fonctionne est que le : fait partie du nom de la méthode, donc en ce qui concerne le compilateur, print y print: sont des messages complètement différents qui ne sont pas plus étroitement liés que "imprimer" et "sprint".

Cependant, les noms particuliers des méthodes que vous avez donnés ne sont pas un très bon exemple pour cela, car le nom ne permet pas de savoir clairement quel est le paramètre (ou ce que "print" signifie si le paramètre est ce que l'objet imprime). Il serait préférable d'avoir, disons, printFalseMessage y printMessageWithFlag: .

7voto

Matt Gallagher Points 10431

Une autre option pour les arguments optionnels multiples est de les passer tous dans un NSDictionary :

- (void)someMethodWithOptions:(NSDictionary *)options;

puis déclarer que le dictionnaire des options peut contenir :

- key1, value must be a BlahObject
- key2, value must be a NonBlahObject

vous pouvez alors permettre à n'importe quelle clé d'être absente et même le dictionnaire lui-même peut être nul.

6voto

Adam Smith Points 2167

Légèrement connexe, vous pouvez avoir des arguments facultatifs. Cela signifie que vous pouvez appeler une méthode avec un nombre quelconque d'arguments si vous le souhaitez. Mais il s'agit d'une fonctionnalité du C (varargs).

Par exemple, le NSArray message :

+ (id)arrayWithObjects:(id)firstObj, ...

Exemple d'utilisation :

NSArray *myArray;
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *aString = @"a string";

myArray = [NSArray arrayWithObjects:aDate, aValue, aString, nil];

Cela vient directement de la documentation d'Apple. Vous indiquez la fin de tous vos arguments avec un signe néant .

1voto

John Wilund Points 144

Pour éviter le Problème d'analyse : 'aVariable' est utilisé comme le nom du paramètre précédent et non comme une partie du sélecteur. que vous recevez du compilateur comme un avertissement que vous devriez faire :

- (void)printWithParameter:(BOOL)sv color:(NSColor *)color{
   // your cool code goes here
   if ( sv ) {
      NSLog(@"cool stuff turned on");
   }
   else {
      NSLog(@"cool stuff turned off");
   }
}

et vous pourriez appeler la méthode, par exemple :

[self printWithParameter:NO color:[UIColor someColor]] // NO instead of 0

ou

[self printWithParameter:YES color:[UIColor someColor]] // YES instead of 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X