メソッドの引数の型を調べる
Objective-Cでメソッド(メッセージ)の型を調べることは可能だろうか、またどのようにして実装すれば良いのだろうか。
いろいろ調べてみたが、自身が持つメソッド"fooBar:"の引数の個数と型を調べるコードは以下のようになるようだ。
SEL selector = @selector(fooBar:); NSMethodSignature *methodSignature = [[self class] instanceMethodSignatureForSelector: selector]; if ( methodSignature ) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: methodSignature]; int i; numberOfArguments = [[invocation methodSignature] numberOfArguments]; NSMutableArray *arguments = [NSMutableArray arrayWithCapacity: numberOfArguments-2]; //序数0にはself、序数1には_cmd(セレクタ)が暗黙的にセットされるので for (i = 2; i < numberOfArguments; i++) { //引数の型をチェック const char *argTypes = [methodSignature getArgumentTypeAtIndex: i]; id arg = nil; [invocation getArgument:&arg atIndex: i]; if (!arg) arg = [NSNull null]; [arguments addObject: arg]; } //戻り値の型をチェック const char *returnType = [methodSignature methodReturnType]; }
つまりはNSMethodSignature-getArgumentTypeAtIndex:で引数の型、NSMethodSignature-methodReturnType:で戻り値の型が戻るのだが、char*で戻る訳であって最後は文字比較になってしまうのが格好悪い。
まあ、この方法しかないなら仕方が無いのだが。