我已經google了一下,才知道如何使用可變參數。但我想將我的可變參數傳遞給另一個方法。我會得到錯誤。怎麼做 ?如何將可變參數傳遞給另一個方法?
-(void) aMethod:(NSString *) a, ... {
[self anotherMethod:a];
// i m doing this but getting error. how to pass complete vararg to anotherMethod
}
我已經google了一下,才知道如何使用可變參數。但我想將我的可變參數傳遞給另一個方法。我會得到錯誤。怎麼做 ?如何將可變參數傳遞給另一個方法?
-(void) aMethod:(NSString *) a, ... {
[self anotherMethod:a];
// i m doing this but getting error. how to pass complete vararg to anotherMethod
}
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]); }
您不能直接傳遞可變參數。但是其中一些方法提供了一種替代方案,您可以通過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__]
這是我的解決方案。
-anotherMethod中有一個內存精益:withParameters:你需要添加一個autorelease到[[NSString alloc] init] – 2010-09-10 20:48:39
true和correct @Bill – Till 2010-09-14 04:23:41
非常好!我想將一個可變參數列表傳遞給predicateWithFormat:在你提出這個建議之後,我意識到Apple事實上已經提供了一個predicateWithFormat:參數:相當於我之前沒有注意到的。 – ArtOfWarfare 2013-06-30 19:05:08