2012-07-04 19 views
5

No sé exactamente cómo formular esta pregunta. Quiero crear un método como stringWithFormat: o predicateWithFormat:, es decir, mi método acepta el argumento directamente como una cadena con especificadores de formato. ¿Cómo puedo conseguir esto?¿Cómo crear un método que acepte cadenas con formato directamente como argumento?

por ejemplo,

-(void) someMethod: (NSString *)str, format; 

De modo que pueda llamar más tarde se siente:

[someObject someMethod:@"String with format %@",anotherString]; 

Esto no es en relación con cualquier contexto particular.

estaba trabajando predicateWithFormat con un código similar a:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like myName"]; 

Esto no funcionó, pero:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like 'myName'"]; 

trabajaron similar a:

NSString *str = @"myName"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",str]; 

Así que este significa que el método puede entender si el argumento dado tiene especificadores de formato ed dentro de ellos. Tengo curiosidad de cómo se puede hacer esto?

Respuesta

4

Está buscando métodos con un número variable de parámetros. Los métodos deben declararse así:

-(void) someMethod: (NSString *)str, ...; // Yes, three dots 

Dentro del método se utilizan macros para extraer los parámetros uno por uno. El primer parámetro necesita suministrar suficiente información para indicar cuántos otros parámetros se pasan. Por ejemplo, stringWithFormat puede indicar cuántos parámetros se pasan contando los especificadores de formato % no guardados.

- (void) someMethod:NSString *)str, ... { 
    va_list args; 
    va_start(args, str); 
    int some_count = /* figure out how many args there are */; 
    for(int i = 0; i < some_count; i++) { 
     value = va_arg(args, <some_type>); // You need to derive the type from the format as well 
    } 
    va_end(args); 
} 
10

utilizar las macros varargs va_start, va_end, etc:

-(void) someMethod: (NSString *)fmt, ... 
{ 
    va_list va; 
    va_start(va, fmt);  
    NSString *string = [[NSString alloc] initWithFormat:fmt 
               arguments:va]; 
    va_end(va); 

    // Do thing with string 
} 

Lo importante para recordar es que los parámetros vararg pierden su tipo por lo que funciona como printf() y [NSString stringWithFormat] utilizan la cadena de formato para ayudar a determinar el número de argumentos que hay son y cómo cada uno debe ser interpretado. Si necesita una semántica diferente, deberá proporcionar esta información de alguna forma.

+0

Puede explicar en varargs macros. Soy bastante nuevo para objetivo-c. – Rakesh

+0

@Rakesh Varargs no son Objective-C, son C. Vea esta página: http://www.eskimo.com/~scs/cclass/int/sx11b.html – trojanfoe

+0

¡muchas gracias! lo tengo. – Rakesh

Cuestiones relacionadas