41

我用谷歌搜索并知道如何使用变量参数。但我想将我的变量参数传递给另一个方法。我收到错误。怎么做 ?

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

4 回答 4

54

AFAIK ObjectiveC(就像 C 和 C++ 一样)没有为您提供允许您直接想到的语法。

通常的解决方法是创建一个函数的两个版本。一个可以直接使用 ... 调用,另一个由其他函数调用,以 va_list 的形式传递参数。

..
[obj aMethod:@"测试这个 %d 参数", 1337);
[obj anotherMethod:@"测试那个 %d 参数", 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]);
}
于 2010-03-06T08:31:28.200 回答
20

您不能直接传递可变参数。但是其中一些方法提供了一种替代方法,您可以传递va_list参数,例如

#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]);
}
于 2010-03-06T08:31:59.243 回答
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];
        }
    }
}
于 2010-10-29T17:06:18.640 回答
0

我认为您可以使用宏来实现相同的目标。假设您想将 aMethod 的变量参数传递给另一个

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

您可以使用宏定义另一个“方法”,尽管它不是真正的方法:

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

这是我的解决方案。

于 2017-08-23T08:40:10.220 回答