問題点
Swift で NSObject の派生クラスを定義すると、自動的に <プロジェクト名>-Swift.h に Objective-C と互換性を保つためのクラスの宣言が自動で書き込まれる。
NSObject を継承させない場合はクラスの宣言の前に @objc を付ければ上記のヘッダファイルに書き込まれる。
ただし、 SWIFT_CLASS(...) の中の文字列が "_TtC<プロジェクト名の文字数><プロジェクト名><クラス名の文字数><クラス名>" などという複雑な構造をしている。
例えば、MyProject というプロジェクト内の
@objc class MyClass {
...
}
の場合は MyProject-Swift.h 内に SWIFT_CLASS("_TtC9MyProject7MyClass") というクラス名として宣言されてしまい、Objective-C 側で
NSClassFromString(@"MyClass") としても nil が返ってきてしまう。
対処法
Swift のクラスの宣言時に、
@objc(MyClass)
class MyClass {
...
}
という風に @objc(<クラス名>) を付ければ、 SWIFT_CLASS("MyClass") と宣言されるので NSClassFromString(@"MyClass") で使えるようになる。