2010-03-06 2 views

답변

49

AFAIK ObjectiveC (C 및 C++과 유사)는 사용자가 직접 염두에두고있는 것을 허용하는 구문을 제공하지 않습니다.

일반적인 해결 방법은 두 가지 버전의 함수를 만드는 것입니다. 하나는 ...를 사용하여 직접 호출 할 수 있고 다른 하나는 다른 매개 변수를 호출하여 va_list 형식으로 매개 변수를 전달합니다.

 
.. 
[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 : withParameters : [[NSString alloc] init] –

+0

에 자동 회수 기능을 추가하고 @Bill – Till

+0

을 수정해야합니다. 가변 인수 목록을 predicateWithFormat에 전달하고 싶습니다. 제안한 후에는 Apple이 사실상 predicateWithFormat : arguments를 제공한다는 사실을 깨달았습니다. – ArtOfWarfare

20

가변 인수를 직접 전달할 수 없습니다. 그러나 이러한 방법 중 일부는 va_list 인수를 전달할 수있는 대안을 제공합니다.

1

귀하의 인수를 배열 또는 사전으로 설정하고 조건부로 코딩하는 것이 고려 되었습니까?

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

매크로를 사용하여 동일한 작업을 수행 할 수 있다고 생각합니다. 이건 내 솔루션은

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

입니다 : 의 당신은 당신이 진정한 방법은 아닙니다하지만 매크로를 사용하여 또 다른 '방법'을 정의 할 수 있습니다 다른

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

에 따른 방법으로의 가변 인수를 전달하고 싶어한다고 가정 해 봅시다.