2009-09-14 3 views
29

Mi piacerebbe scrivere una funzione in Objective-C come quella seguente, che accetta un numero variabile di argomenti e passa quegli argomenti a +stringWithFormat:. So di vsnprintf, ma ciò implicherebbe la conversione del formato 'NSString' in C e ritorno (e significherebbe anche la conversione dei segnaposto di formattazione all'interno di esso ...).Come "passare" un numero variabile di argomenti a NSString's + stringWithFormat:

Il codice di seguito viene compilato, ma naturalmente non si comporta come voglio :)

NSString *estr(NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 
    NSString *s = [NSString stringWithFormat:format, args]; 
    va_end(args); 
    return s; 
} 

In sostanza: esiste una versione va_list -friendly del metodo +stringWithFormat:, o è possibile scrivere uno?

+0

Giusto per dimostrare che questo non è solo un esempio di giocattolo, mi piacerebbe usa anche questo metodo qui: http://cocoaheads.byu.edu/wiki/different-nslog –

+1

Sì, certo! NSLog è troppo chiacchierone, a volte rende difficile la lettura. Quello che avevo in mente è un modo molto semplice di internazionalizzare le mie app ... Voglio scrivere qualcosa come tr (@ "Impossibile aprire il file% @", filePath); per esempio, e questo deve essere semplicemente restituito così com'è (formattato correttamente) nelle prime fasi di sviluppo, poi in seguito avere uno strumento che trova tutte le chiamate tr(), crea i file di risorse necessari per le traduzioni dalle chiamate trovate, poi più avanti cambio semplicemente un interruttore e le chiamate tr() effettivamente effettuano la ricerca e traducono i messaggi che hanno passato ... –

risposta

46

initWithFormat:arguments:

NSString *estr(NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 
    NSString *s = [[[NSString alloc] initWithFormat:format arguments:args] autorelease]; 
    va_end(args); 
    return s; 
} 

non sembrano avere un costruttore di convenienza "stringWith ..." versione

+0

Infatti! Grazie mille, stavo guardando nel posto sbagliato (in più ho dimenticato la chiamata a "autorelease"). Funziona! –

+5

Hai ragione, non hanno un equivalente metodo di convenienza. Ho presentato un Radar (# 7025084) alcuni mesi fa richiedendo questa cosa esatta. Se vuoi questa funzionalità, segnala un bug che richiede '+ [NSString stringWithFormat: arguments:]' e fai riferimento a questo numero Radar - i duplicati (ce n'è uno già) sono i migliori sviluppatori possono fare a "votare" su problemi che considerano essere importante. http://bugreport.apple.com –

+1

Nota: per semplificare il triage, se si registra un bug duplicato, utilizzare il nome del componente "NSString" e la versione "X". Grazie! –