如何将可变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。