我已经搜索过了,了解到如何使用可变参数。但是我想把我的可变参数传递给另一个方法。我遇到了错误。怎么做呢?
-(void) aMethod:(NSString *) a, ... {
[self anotherMethod:a];
// i m doing this but getting error. how to pass complete vararg to anotherMethod
}
我已经搜索过了,了解到如何使用可变参数。但是我想把我的可变参数传递给另一个方法。我遇到了错误。怎么做呢?
-(void) aMethod:(NSString *) a, ... {
[self anotherMethod:a];
// i m doing this but getting error. how to pass complete vararg to anotherMethod
}
-(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]); }
直接传递可变参数是不行的。但是有一些方法提供了一种替代方案,你可以传递一个 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]);
}
你有没有考虑过将你的参数以数组或字典的形式进行设置,并进行有条件的编码呢?
-(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];
}
}
}
我认为你可以使用宏来实现同样的事情。 假设你想将aMethod的变量参数传递给另一个方法
-(void) aMethod:(NSString *) a, ... {
}
虽然它不是真正的方法,但您可以使用宏定义另一个“方法”:
#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__]
这是我的解决方案。