2012-07-04 6 views
5

Nie wiem dokładnie, jak zadać to pytanie. Chcę utworzyć metodę taką jak stringWithFormat: lub predicateWithFormat:, tj. Moja metoda przyjmuje argument bezpośrednio jako ciąg znaków ze specyfikatorami formatu. Jak mogę to osiągnąć?Jak utworzyć metodę akceptującą ciągi o formacie bezpośrednio jako argument?

np

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

Tak, że mogę później nazywają to lubią:

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

To nie jest w odniesieniu do konkretnego kontekstu.

Pracowałem predicateWithFormat z kodem podobnym do:

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

to nie działa, ale:

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

pracował podobny do:

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

więc ta oznacza, że ​​metoda jest w stanie zrozumieć, czy podany argument zawiera specyfikatory formatu ed wewnątrz nich. Jestem ciekawa, jak można to zrobić?

Odpowiedz

4

Szukasz metod o zmiennej liczbie parametrów. Metody należy deklarować w następujący sposób:

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

Wewnątrz metody używane są makra do wyodrębniania parametrów jeden po drugim. Pierwszy parametr musi dostarczyć wystarczającej ilości informacji, aby określić liczbę innych parametrów. Na przykład: stringWithFormat może powiedzieć, ile parametrów zostało przekazanych przez zliczanie bez zmiany znaczenia specyfikatorów formatu w postaci znaków bez zmiany znaczenia:.

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

pomocą makra 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 
} 

Ważną rzeczą do zapamiętania jest to, że parametry vararg tracą typ tak działa jak printf() i [NSString stringWithFormat] użyć ciąg formatu, aby pomóc ustalić, jak wiele argumentów tam są i jak należy je interpretować. Jeśli potrzebujesz innej semantycznej, musisz podać jej pewne informacje.

+0

Czy możesz wyjaśnić na temat makr varargs. Jestem całkiem nowy w stosunku do celu-c. – Rakesh

+0

@Rakesh Varargs nie są Objective-C, są C. Zobacz tę stronę: http://www.eskimo.com/~scs/cclass/int/sx11b.html – trojanfoe

+0

wielkie dzięki! Rozumiem. – Rakesh