itok's Lab

昔の開発ネタを記録として残してます

文字列とメソッドの相互変換

文字列 → メソッド

SEL sel_registerName(const char *str);

メソッド → 文字列

const char* sel_getName(SEL aSelector);

たとえば、状態に応じたメソッドコールをおこないたいときに、メソッドの詰まったテーブルを用意したりすることがあると思うのですが、SEL型変数はobjectとしてあつかわれない(らしい)ので、これも文字列からの変換が一番妥当かな、と。
で、たとえば、こんな感じ、(当然、配列じゃなくてNSDictionaryなんかも使えますね)

@interface ClassA : NSObject
-(void) funcA;
-(void) funcB;
-(void) funcC;
@end
@implementation ClassA
NSString* methodNames[] = {@"funcA", @"funcB",@"funcC"};
-(void) doAction:(int)condition
{
    [self performSelector:sel_registerName([methodNames[condition] cString])];
}

若干コードの視認性に問題があるような気がしたり、デバッグが面倒な気がしたりしますけれども、結構重宝します。拙作のソフトでは至る所で使用されてるような・・・