Lo que estos se denominan, en general, es "funciones variadic" (o métodos, por así decirlo) .
para crear esta, simplemente final su Declartion método con , ...
, como en
- (void)logMessage:(NSString *)message, ...;
En este punto, es probable que desee para envolverlo en una función printf
-como, como la aplicación de uno de los de cero está intentando, en el mejor de los casos.
- (void)logMessage:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSLogv(format, args);
va_end(args);
}
Nota el uso de NSLogv
y no NSLog
; considere NSLog(NSString *, ...);
contra NSLogv(NSString *, va_list);
, o si quiere una cadena; initWithFormat:arguments:
en NSString *
.
Si, por el contrario, usted no está trabajando con cadenas, sino más bien algo como
+ (NSArray *)arrayWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;
las cosas se ponen mucho más fácil.
En ese caso, en lugar de una función al estilo vprintf
, utilice un bucle pasando por args
, asumiendo Identificación medida que avanza, y analizarlos como lo haría en cualquier bucle.
- (void)logMessage:(NSString *)format, ... {
va_list args;
va_start(args, format);
id arg = nil;
while ((arg = va_arg(args,id))) {
/// Do your thing with arg here
}
va_end(args);
}
Esta última muestra, por supuesto, asume que la lista va_args no tiene ningún límite.
Nota: Con el fin de hacer este trabajo que podría que incluir <stdarg.h>
; pero si la memoria sirve, esto se incluye en conexión con NSLogv, lo que significa que se reduce a través de "Foundation.h", por lo tanto también "AppKit.h" y "Cocoa.h", así como una cantidad de otros; así que esto debería funcionar de la caja.
Una cosa para mencionar aquí es que, el primer parámetro de NSString aquí viene como formato, y el otro se pasa en el argumento variable. ¿derecho? Entonces, antes de ingresar al bucle for, tiene que manejar un parámetro. – karim
Sin embargo, ¿es posible evitar la terminación 'nil'? p.ej. obtener la longitud de los argumentos variables? – karim
@karim: No es posible con C varargs saber el número y los tipos de los argumentos. La función llamada tiene que saber de alguna manera los tipos y cuándo detenerse. – newacct