Une méthode qui prend un argument qui est un format

Je souhaite créer une méthode



- appendWithFormat:(?????)aFormat, ...

qui prendrait pour argument un format. Par exemple, quelque chose comme



@Ceci %ld, 5

Cette méthode ensuite, créerait la NSString correspondant à  ce qu'elle reçue, pour l'affecter à  une @property string.


 


Donc, on aurait :



[myObject appendFormat:@Ceci %ld, 5] ;

// qui ferait

myObject.string = [NSString stringWithFormat:@Ceci %ld, 5] ;

Est-ce possible ?


 


Merci !


Réponses

  • AliGatorAliGator Membre, Modérateur
    Oui.
  • MalaMala Membre, Modérateur

     
    + (id)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

    Ca le fait pas?


  • colas_colas_ Membre
    octobre 2013 modifié #4

    @Mala : Oui, ça le fait ! Mais comment je récupère la string formatée dans le corps de ma méthode ?


     


    Merci !


  • AliGatorAliGator Membre, Modérateur
    octobre 2013 modifié #5
    Ca s'appelle "Variadic Arguments" si tu veux un mot clé
    - (void)appendWithFormat:(NSString*)aFormat, ...
    {
    va_list args; // va_list est un type qui représente les arguments qui sont passés à  la place des "..."
    va_start(args, aFormat); // Indiquer que cette liste d'arguments commence après l'argument "aFormat"

    self.propriete = [[NSString alloc] initWithFormat:aFormat arguments:args];

    va_end(args); // Proprement libérer les arguments
    }
    L'idéal est même de marquer cette méthode, quand tu la déclares, avec des attributs qui vont indiquer que ta méthode "appendWithFormat:" prend un format à  la printf/stringWithFormat, comme ça le compilateur pourra te détecter s'il y a des incohérences (genre si tu mets un "%d" mais que tu passes un float ou un objet, ou que tu mets un "%@" alors que tu passes un int...):
    - (void)appendWithFormat:(NSString*)aFormat, ... NS_FORMAT_FUNCTION(1,2);
    La macro NS_FORMAT_FUNCTION est une macro qui rajoute un __attribute__ GNU C sur ta fonction pour l'annoter et indiquer au compilateur qu'il doit s'attendre à  un format à  la stringWithFormat, dont le paramètre de format est en première position (1) et les arguments à  utiliser pour ce remplir format commencent à  partir du deuxième argument (2).



    Bon, après, en pratique j'espère que c'était que pour l'exemple que tu demandais ça, car là  en l'occurrence je viens de te coder une fonction qui ne sert à  rien, puisqu'elle fait exactement la même chose que la méthode "+stringWithFormat:", mais bon, au moins tu sauras comment te créer la tienne si tu en as besoin un jour ;)
  • J'ai un objet qui a une propriété NSString et je voulais créer une méthode qui me permettent de remplir cette propriété avec un format.


     


    Merci !!!


  • colas_colas_ Membre
    octobre 2013 modifié #7

    À propos de "Proprement libérer les arguments", est-ce que ce qui suit est mal ?



    - (id)initWithFormat:(NSString *)aFormat, ...
    {
    /*
    Merci Ali !!
    http://forum.cocoacafe.fr/topic/11660-une-méthode-qui-prend-un-argument-qui-est-un-format/
    */

    va_list args; // va_list est un type qui représente les arguments qui sont passés à  la place des "..."
    va_start(args, aFormat); // Indiquer que cette liste d'arguments commence après l'argument "aFormat"

    return [self initWithString:[[NSString alloc] initWithFormat:aFormat
    arguments:args]];

    va_end(args); // Proprement libérer les arguments
    }


    En effet, le return apparaà®t avant la ligne



    va_end(args); // Proprement libérer les arguments


    Vaut-il mieux faire ?



    - (id)initWithFormat:(NSString *)aFormat, ...
    {
    /*
    Merci Ali !!
    http://forum.cocoacafe.fr/topic/11660-une-méthode-qui-prend-un-argument-qui-est-un-format/
    */

    va_list args; // va_list est un type qui représente les arguments qui sont passés à  la place des "..."
    va_start(args, aFormat); // Indiquer que cette liste d'arguments commence après l'argument "aFormat"

    MyClass * myObject = [self initWithString:[[NSString alloc] initWithFormat:aFormat
    arguments:args]];

    va_end(args); // Proprement libérer les arguments

    return myObject ;
    }
  • AliGatorAliGator Membre, Modérateur
    Heu rassures-moi, après avoir réfléchi 2s à  ta question, tu réalises que c'est une question basique ? Tu sais au moins que return te fait sortir tout de suite (et que donc tout ce qu'il y a après n'est jamais exécuté) ?
    Allez, comme c'est une instruction de base, je mets ça sur la fatigue du début de semaine va ;)
  • OK Ali, merci !


     


    Oui, la fatigue ;-)


Connectez-vous ou Inscrivez-vous pour répondre.