オブジェクトやセレクタを文字列から生成する

たとえば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を継承したオブジェクトなんかを使うならばそれなり。
まあエラーを気にしなければもっと単純でも動きはしますが。