如何将可变parameter passing给另一个方法?
我GOOGLE了,并知道如何使用可变参数。 但我想通过我的可变参数到另一种方法。 即时通讯错误。 怎么做 ?
-(void) aMethod:(NSString *) a, ... { [self anotherMethod:a]; // im doing this but getting error. how to pass complete vararg to anotherMethod }
AFAIK ObjectiveC(就像C和C ++一样)不提供给你一个允许直接考虑的语法。
通常的解决方法是创build一个函数的两个版本。 一个可以直接使用…而另一个被别人调用的函数以va_list的forms传递参数。
..
[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]);
}
你不能直接传递可变参数。 但是其中一些方法提供了一个可以传递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]; } } }
我想你可以使用macros来实现同样的事情。 假设你想将方法的可变parameter passing给另一个参数
-(void) aMethod:(NSString *) a, ... { }
你可以使用macros定义你的另一个“方法”,虽然它不是一个真正的方法:
#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__]
这是我的解决scheme。