2009-09-14 14 views
29

Me gustaría escribir una función en Objective-C como la de abajo, que toma un número variable de argumentos, y pasa esos argumentos a +stringWithFormat:. Sé de vsnprintf, pero eso implicaría convertir el 'formato' de NSString a C y viceversa (y también significaría convertir los marcadores de posición de formato dentro de él también ...).Cómo "transmitir" un número variable de argumentos a NSString's + stringWithFormat:

El siguiente código compila, pero por supuesto no se comporta como quiero :)

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

Básicamente: ¿hay una versión -Friendly va_list del método +stringWithFormat:, o es posible escribir uno?

+0

Sólo para demostrar que esto no es sólo un ejemplo de juguete, me encantaría use también este método aquí: http://cocoaheads.byu.edu/wiki/different-nslog –

+1

¡Sí, de hecho! NSLog es demasiado hablador, hace que sea difícil de leer a veces. Lo que tenía en mente es una forma muy simple de internacionalizar mis aplicaciones ... Quiero escribir algo como tr (@ "No se puede abrir el archivo% @", filePath); por ejemplo, y haga que esto simplemente se devuelva tal como está (correctamente formateado) en las primeras etapas de desarrollo, y luego tenga una herramienta que encuentre todas las llamadas tr(), cree los archivos de recursos necesarios para las traducciones de las llamadas que encontró. luego, simplemente cambio un interruptor y las llamadas tr() realmente buscan y traducen los mensajes que se pasaron ... –

Respuesta

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; 
} 

que no parecen tener un constructor de conveniencia "stringWith ..." versión

+0

¡De hecho! Muchas gracias, estaba buscando en el lugar equivocado (además, olvidé la llamada a 'liberación automática'). ¡Esto funciona! –

+5

Tiene razón, no tienen un método de conveniencia equivalente. Archivé un radar (# 7025084) hace unos meses solicitando esta cosa exacta. Si desea esta funcionalidad, informe un error solicitando '+ [NSString stringWithFormat: arguments:]' y haga referencia a este número de radar: los duplicados (ya hay uno) son los mejores que los desarrolladores pueden hacer para "votar" sobre asuntos que consideran importante. http://bugreport.apple.com –

+1

Nota: para simplificar el triage, si archiva un error duplicado, utilice el nombre del componente "NSString" y la versión "X". ¡Gracias! –

Cuestiones relacionadas