2010-06-29 6 views
9

Non riesco a capire la sintassi per più argomenti in Objective-C. Ho visto this question, ma la risposta non mi ha aiutato (ancora).Come utilizzare va_args per passare argomenti (parametri variabili, puntini di sospensione)

Ecco il mio codice (in realtà io voglio passare infine a NSString stringWithFormat, ma ottenendo un NSLog a lavorare sarebbe abbastanza buono per ora):

- (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'argomento (o qualche argomento) passa attraverso , ma ha qualche valore strano (l'output è blah blah 1606412704). Come devo passare i valori che arrivano via ...?

+0

Correlato a, ma non proprio un duplicato di: http://stackoverflow.com/questions/2345196 –

risposta

20

C'è una variante di NSLog che accetta un va_list chiamato NSLogv:

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

L'unico modo per trasmettere il reale ... (non il va_list) è quello di usa una macro. Per esempio:

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

Tuttavia, questo dovrebbe essere usato con molta parsimonia, dal momento che le macro possono rendere il codice davvero offuscato.

+0

È bello e +1, ma non so ancora come passare gli argomenti al metodo successivo (o forse lo sto facendo bene?) –

+3

Non è possibile. Una volta '...' viene convertito in 'va_list', può essere passato solo a una funzione o un metodo che accetta' va_list', non a una funzione/metodo che accetta un numero variabile di parametri. – Yuji

+0

@Yuji, ooooooooooooooooo lemme provalo. –

12

Potreste usare -[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. Mentre questo non risponde alla mia domanda, risolve il mio problema attuale. Come faresti a passare gli argomenti al metodo successivo, però? –

+0

Non è possibile passare i parametri della variabile. Puoi passare 'args', ma ciò significa che la funzione o il metodo deve prendere un oggetto di tipo' va_list'. – mipadi

+1

Ok, è molto bello. Ho finito per fare questo '- (void) log: (NSString *) testo, ...;' e '- (void) log: (NSString *) testo conArguments: (va_list) lista;' –

Problemi correlati