オブジェクトやセレクタを文字列から生成する
たとえばPHPの場合、
Hogeというクラスにhugaというメソッドがあれば
$class = "Hoge"; $method = "huga"; if(class_exists($class)){ $obj = new $class; if(method_exists($obj, $method)){ $obj->$method(); } } ?>
みたいに書けます。
同じようなことをObjective-Cでやりたいというのが今日の話。
selectorが文字列から作成できることは
前から知っていたんですが、
オブジェクトも作れるのかなぁ、と思いつつ
検索したらありました。
Cocoa実現の肝 - クラスとそのメソッドの調査方法をチェック
という記事参照。
だいたいこんな感じ。
NSString *hoge = @"Hoge"; NSString *huga = @"huga"; Class class; SEL sel; class = NSClassFromString(hoge); sel = NSSelectorFromString(huga); if(class){ id obj = [[class alloc] init]; if([obj isKindOfClass:[Hoge class]]){ Hoge *hogeObj = obj; if([hogeObj respondsToSelector:sel]){ [hogeObj performSelector:sel]; } } }
NSClassFromStringで取れるのはクラスオブジェクトなので
そのままではisKindOfClass:が使えないのがめんどくさげ。
型指定なので上記のコードそのままだと
それほど面白くない感じですが、
Hogeを継承したオブジェクトなんかを使うならばそれなり。
まあエラーを気にしなければもっと単純でも動きはしますが。