はじめに
NSClassFromStringは、クラスの名前からClassを生成できる便利なメソッドですがswiftで使用するときにNSという前時代のprefixがついているように癖があります。そこの話をちゃちゃっとまとめてみました。
swiftでのクラスの取得方法の注意点
NSClassFromStringで取得できるクラスはswiftでは、モジュールの名前空間に影響されてしまい、モジュール名(Project Name)+ "." + ClassNameというストリングを渡さなければいけません。またモジュール名を渡さない場合は、定義しているクラスの頭に
@objc(ClassName)
class ClassName : NSObject {
...
}
として、@objc(ClassName)をつけてやるとNSClassFromStringからクラス名だけで取得できるようにはなっています。
要注意モジュール名
自分がハマったのですが、module + "." + ClassNameとしてもどうしてもNSClassFromStringがnilを返してくる場合がありました。classに@objcをつけるとClassNameだけできちんと値が返ってきたので、渡していClassNameが間違っているというわけではないようで、色々調べたところプロジェクト名に"-"がついている場合、その"-"の文字を"_"に置き換えて、moduleネームに渡さないとはいけないようです,つまり、
my-project-name
の場合
my_project_name
になります。
まとめ
NSClassFromStringを使う場面もそんなにないかもですが、気をつけて使用しましょう。