文字列をクラス名に変換したい。たとえば、文字列"MyExampleClass"
などのクラス名を含む文字列が変更されたとします。ここで、クラスMyExampleClass
のオブジェクトを作成します。文字列からクラス名を取得する必要があります。次のようなことをしたいです。 (コードをスケッチと同じように考えてください。)
NSString *classNameStr = "MyExampleClass";
id theClass = [UIClass classFromString:classNameStr];
theClass *myObject = [[theClass alloc] init];
これを行う正しい方法は何ですか?
これがあなたが望むものです:
Class theClass = NSClassFromString(classNameStr);
id myObject = [[theClass alloc] init];
theClass
をタイプ名として使用できないことに注意してください(つまり、theClass *myObject
)。そのためにはid
を使用する必要があります。
NSClassFromString
が必要です:
_NSString *classNameStr = @"MyExampleClass";
Class theClass = NSClassFromString(classNameStr);
id myObject = [[theClass alloc] init];
_
Objcランタイムインターフェースを使用することもできます(例:objc_getClass(const char* name)
、objc_lookUpClass(const char* name)
)。前者はクラスをロードしません。後者はそうするでしょう。そのオプションは、場合によっては良いことかもしれません。
id a = [[NSClassFromString(@"MyExampleClass") alloc] init];
これを使用すると、必要なものが得られます。
クラスを動的に構築しようとしている場合は、ファクトリメソッドのデザインパターンをよく調べることをお勧めします。そうしないと、誰が何をどのように構築するかがわかりません。
これを行うには、文字列を受け取り、入力文字列に応じてクラスを返すクラスをコーディングできます。
Erich Gammaによる本「DesignPatterns:Elements of Reusable Object-OrientedSoftware」をご覧ください。リチャードヘルム;ラルフジョンソン;ジョン・ブリシディーズ。