2012-07-04 11 views
5

Non so esattamente come porre questa domanda. Voglio creare un metodo come stringWithFormat: o predicateWithFormat:, cioè il mio metodo accetta argomenti direttamente come stringa con specificatori di formato. Come posso raggiungere questo obiettivo?Come creare un metodo che accetta le stringhe con il formato direttamente come argomento?

esempio

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

Così che io possa poi chiamarlo piace:

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

Questo non è in relazione a qualsiasi particolare contesto.

stavo lavorando predicateWithFormat con un codice simile a:

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

Questo non ha funzionato, ma:

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

lavorato simile a:

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

Quindi questo significa che il metodo è in grado di capire se l'argomento specificato ha degli specificatori di formato Ed dentro di loro. Sono curioso di sapere come si può fare?

risposta

4

Stai cercando metodi con numero variabile di parametri. I metodi devono essere dichiarate in questo modo:

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

All'interno del metodo si utilizza le macro per estrarre i parametri uno per uno. Il primo parametro deve fornire informazioni sufficienti per indicare quanti altri parametri vengono passati. Ad esempio, stringWithFormat può indicare quanti parametri vengono passati contando gli identificatori di formato % senza caratteri di escape.

- (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

utilizzare le macro varargs va_start, va_end, ecc:

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

La cosa importante da ricordare è che i parametri vararg perdono il loro tipo in modo funzioni come printf() e [NSString stringWithFormat] utilizzano la stringa di formato per aiutare a determinare quanti argomenti vi sono e come ciascuno dovrebbe essere interpretato. Se hai bisogno di una semantica diversa, dovrai fornire queste informazioni in qualche modo.

+0

Potete spiegarlo sui macro di vararg. Sono abbastanza nuovo per l'obiettivo-c. – Rakesh

+0

@Rakesh Varargs non sono Objective-C, sono C. Vedi questa pagina: http://www.eskimo.com/~scs/cclass/int/sx11b.html – trojanfoe

+0

grazie mille! fatto. – Rakesh

Problemi correlati