Question Arguments optionnels dans Objective-C 2.0?


Dans Objective-C 2.0, est-il possible de créer une méthode où l'argument est facultatif? Autrement dit, vous pouvez avoir un appel de méthode comme celui-ci:

[aFraction print];

ainsi que cette:

[aFraction print: someParameter];

dans le même programme.

Pommes Objective-C 2.0 Programming Language Le guide oppose Obj-C à Python et semble dire que ce n'est pas autorisé. J'apprends encore et je veux être sûr. Si ça est possible, alors quelle est la syntaxe, car mon deuxième exemple de code ne fonctionne pas.

Mettre à jour: OK, je viens de faire deux méthodes, toutes deux nommées "print".

entête

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

la mise en oeuvre

-(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 ne peux pas croire que cela a fonctionné. Y a-t-il une raison pour laquelle je ne devrais pas faire cela?


47
2018-02-18 14:11


origine


Réponses:


Vous pouvez déclarer plusieurs méthodes:

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

Dans la mise en œuvre, vous pouvez le faire:

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

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

Modifier:

S'il vous plaît ne pas utiliser print et print: en même temps. Tout d'abord, il n'indique pas quel est le paramètre et, d'autre part, personne (ab) n'utilise Objective-C de cette manière. La plupart des frameworks ont des noms de méthode très clairs, c'est une chose qui rend 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;

77
2018-02-18 14:17



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

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

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

Cependant, les noms particuliers des méthodes que vous avez donnés ne sont pas très pertinents car le nom ne précise pas le paramètre (ou ce que «imprimer» en soi signifie si le paramètre est ce que l'objet imprime). Il serait préférable d'avoir, disons, printFalseMessage et printMessageWithFlag:.


15
2018-02-19 01:51



Une autre option pour plusieurs arguments facultatifs consiste à les transmettre tous dans un NSDictionary:

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

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

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

vous pouvez alors laisser les touches absentes et même le dictionnaire peut être nul.


7
2018-02-20 00:21



Légèrement lié, vous pouvez avoir des arguments optionnels. Cela signifie que vous pouvez appeler une méthode avec un nombre quelconque d'arguments si vous le souhaitez. Mais c'est une fonctionnalité de C (varargs).

Un exemple, est 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 des documents Apple. Vous indiquez la fin de tous vos arguments avec un néant.


5
2018-02-19 08:43



Pour éviter le Problème d'analyse: 'aVariable' utilisé comme nom du paramètre précédent plutôt que comme partie du sélecteur vous obtenez 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 pouvez 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

1
2018-02-15 13:33