私はググって、可変引数の使い方を知った。しかし、可変引数を別のメソッドに渡したいのですが。エラーが発生します。どうやってするか ?
-(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++のように)は、ユーザーが直接考えていることを可能にする構文を提供しません。
通常の回避策は、関数の2つのバージョンを作成することです。 ...を使用して直接呼び出すことができるものと、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__]
これが私の解決策です。