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