2010-03-06 23 views
37

Ben googled ve değişken argümanlar nasıl kullanılacağını bilmek geldi. ama değişken argümanlarımı başka bir yönteme geçmek istiyorum. Hataları alıyorum. bu nasıl yapılır ?Değişken argümanlarını başka bir yönteme nasıl geçirirsiniz?

-(void) aMethod:(NSString *) a, ... { 
    [self anotherMethod:a]; 
    // i m doing this but getting error. how to pass complete vararg to anotherMethod 
} 

cevap

49

(sadece C ve C++ gibi) AFAIK ObjectiveC doğrudan aklında ne sağlayan bir sözdizimi ile size sağlamaz.

Normal çözüm, bir işlevin iki sürümünü oluşturmaktır. Doğrudan kullanarak çağrılabilir ... ve başkaları tarafından çağrılan bir başka parametreler bir va_list biçiminde parametreleri geçiriyor.

 
.. 
[obj aMethod:@"test this %d parameter", 1337); 
[obj anotherMethod:@"test that %d parameter", 666); 
.. 

-(void) aMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a withParameters:(va_list)valist 
{ 
    NSLog([[[NSString alloc] initWithFormat:a arguments:valist] autorelease]); 
} 
+1

-anotherMethod içinde bir bellek var: withParameters: [[NSString alloc] init] –

+0

true için bir otomatikleştirme eklemeniz ve @Bill – Till

+0

Mükemmel! WithFormat'ı tahmin etmek için bir değişken argüman listesi iletmek istedim: ve bunu önerdikten sonra, Apple'ın aslında daha önce fark etmemiş olduğum bir eşdeğerWithFormat: argüman sağladığını fark ettim. – ArtOfWarfare

20

Doğrudan değişken argümanları geçemezsiniz. Ancak, bu yöntemlerden bazıları, va_list argümanını örn.

#include <stdarg.h> 

-(void)printFormat:(NSString*)format, ... { 
    // Won't work: 
    // NSString* str = [NSString stringWithFormat:format]; 

    va_list vl; 
    va_start(vl, format); 
    NSString* str = [[[NSString alloc] initWithFormat:format arguments:vl] autorelease]; 
    va_end(vl); 

    printf("%s", [str UTF8String]); 
} 
1

Argümanlarınızı bir dizide veya sözlüğünde ayarlamayı ve koşullu olarak kodlamayı düşündünüz mü?

-(void) aMethodWithArguments:(NSArray *)arguments { 
    for (id *object in arguments) { 
     if ([object isKindOfClass:fooClass]) { 
      //handler for objects that are foo 
      [self anotherMethod:object]; 
     } 
     if ([object isKindOfClass:barClass]) { 
      //and so on... 
      [self yetAnotherMethod:object]; 
     } 
    } 
} 
0

Aynı şeyi elde etmek için makroları kullanabileceğinizi düşünüyorum. Bu benim çözüm

#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__] 

geçerli: Diyelim ki sen gerçek bir yöntem olmasa da makro kullanarak başka bir 'yöntem' tanımlayabiliriz başka

-(void) aMethod:(NSString *) a, ... { 
} 

için aMethod en değişken argümanları geçmesi istiyorum diyelim.

İlgili konular