7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Objective-C の NSClassFromString で Swift のクラスを生成する

Last updated at Posted at 2015-03-31

問題点

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") で使えるようになる。

参考サイト

ios - Swift language NSClassFromString - Stack Overflow

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?