2012-07-04 13 views
5

Bu soruyu tam olarak nasıl koyacağımı bilmiyorum. stringWithFormat: veya predicateWithFormat: gibi bir yöntem oluşturmak istiyorum, yani yöntemim argümanları doğrudan biçim belirticileri olan bir dize olarak kabul eder. Bunu nasıl başarabilirim?Doğrudan argüman olarak formatlı dizeleri kabul eden bir yöntem nasıl oluşturulur?

Ör

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

Yani sonradan çağırabilir o gibi:

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

Bu herhangi bir bağlamda ilgili olarak değil.

Ben benzer bir kod ile predicateWithFormat çalışıyordu: Bu işe yaramadı

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

ama: Yani bu

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

:

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

benzer çalıştı yöntem, verilen argümanın bize formatı belirlediğini anlayabileceği anlamına gelir onların içinde. Merak ediyorum, bu nasıl yapılabilir?

cevap

4

Değişken sayıda parametre içeren yöntemler arıyorsunuz. Yöntemler böyle bildirilmesi gerekir:

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

Eğer parametreleri teker teker ayıklamak için makro kullanma yöntemine içinde. İlk parametrenin kaç parametrenin geçtiğini bildirmek için yeterli bilgi sağlaması gerekir. Örneğin, stringWithFormat, çıkışsız % biçim belirleyicileri sayılarak kaç parametrenin geçirildiğini söyleyebilir.

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

vb varargs makro va_start, va_end, kullanın:

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

hatırlamak önemli şey printf() ve [NSString stringWithFormat] gibi fonksiyonlar orada kaç argüman belirlemeye yardımcı olmak için biçim dizesi kullanmak böylece vararg parametreleri kendi türünü kaybetmek her biri nasıl yorumlanmalıdır. Eğer farklı bir anlamsallığa ihtiyacınız varsa, o zaman bu bilgiyi nasıl sağlamanız gerekecektir.

+0

Lütfen varargs makrolarını açıklar mısınız? Ben objektif-c için oldukça yeniim. – Rakesh

+0

@Rakesh Varargs, Objective-C değildir, bunlar C'dir. Bu sayfaya bakın: http://www.eskimo.com/~scs/cclass/int/sx11b.html – trojanfoe

+0

çok teşekkürler! anladım. – Rakesh

İlgili konular