2010-06-29 7 views
9

Je ne peux pas comprendre la syntaxe de plusieurs arguments dans Objective-C. J'ai vu this question, mais la réponse ne m'a pas (encore) aidé.Comment utiliser va_args pour passer des arguments (paramètres variadiques, ellipses)

Voici mon code (en fait, je veux éventuellement passer à NSString stringWithFormat, mais obtenir un NSLog travailler serait assez bon pour l'instant):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // Insert code here to initialize your application 
    [self log:@"blah blah %d", 32]; 
} 


- (void)log:(NSString *)text, ... { 
     va_list args; 
     va_start(args, text); 
     NSLog(text, args); 
} 

L'argument (ou un argument) vient par , mais il a une valeur bizarre (la sortie est blah blah 1606412704). Comment dois-je transmettre les valeurs entrées via ...?

+0

Relatif à, mais pas tout à fait un doublon de: http://stackoverflow.com/questions/2345196 –

Répondre

20

Il y a une variante de NSLog qui accepte un va_list appelé NSLogv:

- (void) log:(NSString *)text, ... { 
    va_list args; 
    va_start(args, text); 
    NSLogv(text, args); 
    va_end(args); 
} 

La seule façon de transmettre la ... réelle (pas le va_list) est de utilise une macro. Par exemple:

#define MyLog(f, ...) { \ 
NSLog(f, ##__VA_ARGS__); \ 
[someObject doSomething:f, ##__VA_ARGS__]; \ 
} 

Cependant, cela devrait être utilisé avec parcimonie, car les macros peuvent rendre le code vraiment obscurcie.

+0

C'est cool et +1, mais je ne sais toujours pas comment passer les arguments à la méthode suivante (ou peut-être que je le fais bien?) –

+3

Vous ne pouvez pas. Une fois que '...' est converti en 'va_list', il ne peut être transmis qu'à une fonction ou une méthode qui accepte' va_list', pas à une fonction/méthode qui accepte un nombre variable de paramètres. – Yuji

+0

@ Yuji, ooooooooooooooooo lemme essayer cela. –

12

Vous pouvez utiliser -[NSString initWithFormat:arguments:]:

- (void)log:(NSString *)text, ... 
{ 
    va_list args; 
    va_start(args, text); 
    NSString *log_msg = [[[NSString alloc] initWithFormat:text arguments:args] autorelease]; 
    NSLog(@"%@", log_msg); 
} 
+0

Wow. Bien que cela ne réponde pas à ma question, cela résout mon problème actuel. Comment passeriez-vous les arguments à la prochaine méthode, cependant? –

+0

Vous ne pouvez pas transmettre les paramètres de la variable. Vous pouvez passer 'args', mais cela signifie que la fonction ou la méthode doit prendre un objet de type' va_list'. – mipadi

+1

D'accord, c'est très cool. J'ai fini par faire ce '- (void) log: (NSString *) text, ...;' et '- (void) log: (NSString *) text avecArguments: (va_list) list;' –

Questions connexes