Question conne

Si je veux créer une méthode avec plusieurs paramètres, puis-je le faire de cette façon ?

ex :  - (NSString *)apportCalorique:(int)age:(int)activite:(int)sexe;

Réponses

  • Paisible.frPaisible.fr Membre
    14:11 modifié #2
    Plutôt comme cela :

    - (NSString *)apportCalorique:(int)age  activite:(int)uneActivite sexe:(int)leSexe;
  • 14:11 modifié #3
    gnome06 a raison, mais tu n'es pas forcé de suivre sa manière de faire hein  :o Mais c'est juste histoire d'avoir plus de clarter dans la fonction.
    - (NSString*)apportCaloriquePourAge:(int)unAge activite:(int)uneActivite sexe:(int)leSexe;

    (j'utiliserai même une version anglaise.. mais ça dépend si t'es à  l'aise ou pas avec l'anglais).
  • Paisible.frPaisible.fr Membre
    14:11 modifié #4
    dans 1221501381:

    gnome06 a raison, mais tu n'es pas forcé de suivre sa manière de faire hein  :o Mais c'est juste histoire d'avoir plus de clarter dans la fonction.
    - (NSString*)apportCaloriquePourAge:(int)unAge activite:(int)uneActivite sexe:(int)leSexe;

    (j'utiliserai même une version anglaise.. mais ça dépend si t'es à  l'aise ou pas avec l'anglais).


    Je suis tout à  fait d'accord avec toi Eaglelouk, j'avais fait une réponse à  la va-vite.
    Mais il est clair qu'il faut essayer de donner des noms parlant à  ses methodes, variables, etc...
    En anglais c'est mieux en général.
  • AliGatorAliGator Membre, Modérateur
    14:11 modifié #5
    dans 1221500049:

    Si je veux créer une méthode avec plusieurs paramètres, puis-je le faire de cette façon ?

    ex :  - (NSString *)apportCalorique:(int)age:(int)activite:(int)sexe;
    En fait la noration que tu as donnée est correcte, mais super rarement employée, pour ne pas dire jamais.

    Une méthode Objective-C est composée :
    - d'un symbole "+" pour les méthodes de classe ou d'un "-" pour les méthodes d'instance (les plus courantes)
    - du type de retour entre parenthèses, comme "(NSString*)"
    - d'un nom de méthode, par exemple "apportCalorique"
    - pour chaque paramètre, un nom optionnel (et pas de nom pour le premier argument où le nom de la méthode sert déjà  à  ça en fait), suivi de ":", suivi d'un type entre parenthèses, suivi du nom de variable associé au paramètre

    Donc pour une méthode sans paramètre par exemple :
    [tt] - (NSString*)retourneUneChaine[/tt]
    Pour une méthode avec un paramètre :
    [tt] - (NSString*)faitUnTrucAvecLeParametre: (NSString*)leParam1[/tt]
    Pour une méthode avec deux paramètres :
    [tt] - (NSString*)faitUnTrucAvecLeParametre: (NSString*)leParam1 etLeParam:(NSString*)leParam2[/tt]

    - En bleu : le nom de ta méthode. Sert aussi souvent de "nom pour le premier argument" en même temps (quand il y en a un). D'où le nommage du genre "...AvecLeParametre:" pour "introduire" le paramètre qui suit
    - En vert les variables associées aux paramètres, variables qui recevront les valeurs passées en paramètre lors de l'appel à  ta méthode.
    - En rouge les noms introduisant les variables. Ces noms sont en théorie optionnels mais je n'ai jamais vu personne les omettre car ils rendent la méthode bien plus lisible :)

    Donc avec ton code tu auras déclaré la méthode "[tt]apportCalorique: : :[/tt]" (remarque les trois ":", chaque ":" introduisant un argument... qui ici n'est introduit par aucun nom justement) mais sans nom pour introduire tes arguments. Ce qui est correct d'après ce qu'autorise la syntaxe d'Objective-C, mais ça veut aussi dire que pour l'appeler, faudra écrire : [tt][self apportCalorique:5 :2 :1][/tt] ce qui est bien moins facile à  lire/comprendre que [tt][self apportCaloriquePourAge:5 activite:2 sexe:1][/tt] ;)


    Et ce serait encore mieux si au lieu d'entiers (int) tu mettais des enum pour tes arguments "activités" et "sexe" : d'une part ça serait encore plus lisible, mais en plus ça éviterait des éventuelles erreurs lors du codage ou des confusions dans les valeurs, qui seront plus explicites avec un nom qu'un simple entier ;)

    typedef enum { HOMME , FEMME } tSexe;<br />typedef enum { INACTIF, SPORTIF } tActivite;<br /><br /> - (NSString*)apportCaloriquePourAge:(int)unAge activite:(tActivite)uneActivite sexe:(tSexe)leSexe;<br />
    
  • Philippe49Philippe49 Membre
    14:11 modifié #6
    dans 1221503612:

    dans 1221500049:

    Si je veux créer une méthode avec plusieurs paramètres, puis-je le faire de cette façon ?

    ex :  - (NSString *)apportCalorique:(int)age:(int)activite:(int)sexe;
    En fait la noration que tu as donnée est correcte, mais super rarement employée, pour ne pas dire jamais.


    J'ai compris ce que tu as en tête, mais en fait cela ne marche pas, et puisqu'une fois n'est pas coutûme, je propose pour mon retour un


    [size=12pt]Petit Essai[/size]
    #import <Foundation/Foundation.h>

    @interface President : NSObject {
    }
    -(void) faire:(int) avec:(NSString*);
    @end

    @implementation President

    -(void) faire:(int)a avec:(NSString*) s{
    // Préciser les modalités
    }
    @end
    #define TACTAC 1

    int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
    President * nicolas=[[[President alloc] init] autorelease];
    [nicolas faire:TACTAC avec:@Carla];
    [pool drain];
    return 0;
    }

    Eh ben ça, ça coince.
    Surtout l'autorelease pour Nicolas, j'ai l'impression que cela ne va pas être de la tarte !!!  ;D
  • AliGatorAliGator Membre, Modérateur
    septembre 2008 modifié #7
    Salut Phillipe49,

    Si c'est à  moi que tu répondais, je pensais à  un enum et pas un #define... et adapter donc les arguments en conséquence.
    Par contre j'ai fait ton petit essai, je vois pas où ça coince ? A part... qu'il faut mettre des noms aux arguments (derrière le type entre parenthèses, quoi) dans le @interface
    Ce qui est normal car si tu le fais pas, rien que pour le premier argument, le "avec" derrière ton "faire:(int)" est pris comme le nom de ta variable pour ton premier argument, du coup ton 2e argument n'a pas de nom... alors qu'avec [tt]faire:(int)a avec:(NSString*)b[/tt] tout passe bien... mais avec [tt]faire:(int)a :(NSString*)b :(NSArray**)c[/tt] aussi (et là  les arguments ont une variable associée, mais pas de "nom" pour les introduire) ;)

    #import &lt;Foundation/Foundation.h&gt;<br /><br />typedef enum { INACTIF, PARESSEUX, SPORTIF } tActivity;<br />typedef enum { HOMME, FEMME } tSexe;<br /><br />@interface BalanceBete : NSObject<br />{<br />}<br />-(int) poidsIdealPourAge:(int)age activity:(tActivity)activite sexe:(tSexe)s;<br />@end<br /><br />@implementation BalanceBete<br /><br />-(int) poidsIdealPourAge:(int)age activity:(tActivity)activite sexe:(tSexe)s<br />{<br />	return 60;<br />}<br />@end<br /><br />int main (int argc, const char * argv&#91;]) {<br />	NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];<br />	<br />	BalanceBete * bal = [[[BalanceBete alloc] init] autorelease];<br />	NSLog(@&quot;Poids : %d&quot; , [bal poidsIdealPourAge:35 activity:PARESSEUX sexe:HOMME] );<br />	<br />	[pool drain];<br />	return 0;<br />}
    


    Allez pour le coup je te payer la bière, comme promis dans les précédents posts, faut bien instaurer la tradition  :p :p
  • Philippe49Philippe49 Membre
    septembre 2008 modifié #8
    Oui, Ali, merci pour la bière, [size=12pt]que la tradition perdure[/size] ...  :o

    Je voyais une possible confusion dans le post avec la possibilité (qui est admise en C) de ne pas mettre les arguments dans la déclaration d'une fonction.
    void faireAvec(int,NSString*)
    Cela apparaà®t dans la question initiale d'Adriker, et au point de vue syntaxique cela ne serait pas impossible, le séparateur ':' en permettant l'analyse au compilateur.

    le TACTAC c'est pour le fun ...
    Ton invitation à  utiliser les énumérations est évidemment excellente.
  • 14:11 modifié #9
    Merci pour vos aides !
Connectez-vous ou Inscrivez-vous pour répondre.