swiftのクラスをobjective-Cから参照したい


単純にswiftクラスを定義しただけでは、objective-Cから参照することはできません。

swiftのクラスをobjective-Cから参照するためには

一番大事なことは、 [ProjectName]-Swift.h クラスを用いること!です。

[ProjectName]-Swift.h について

そのままの意味ですが、objective-Cからwwiftファイルを読み込むための中間ファイルです。
ビルド成功によって、自動生成されます。
つまり作成されていた分のSwiftファイル情報が、ビルド成功時に自動的に [ProjectName]-Swift.h ファイルに記載されることとなります。

※ビルド成功しないと、生成・更新されないので注意。

[ProjectName]-Swift.hを使う

swiftを利用したい .m ファイルでimportします。

#import "[ProjectName]-Swift.h"

これで、swiftのクラスをobjective-Cから参照することができます。

でも参照できない場合がある!!

上記で成功しない場合、なにかしらの原因があります。

チェック1:参照するクラスはNSObjectの派生クラス?

objective-Cのオブジェクトは、 全てNSObject です。
そのため、objective-CはNSObjectのクラスじゃないと参照できません。

チェック2:クラスに @objcMembers を付けてる?

swift4から導入されたものです。
Objective-Cから使用できるswiftのクラスは明示的に宣言することになりました。
下記のように宣言しなければなりません。

@objcMembers
class HogeClass: NSObject {
}

チェック3:その他

  • ビルドが失敗していませんか?
  • ビルドプロジェクトに属しているクラスですか?

※もっと原因があれば、都度追記します。

例外:swiftのstructは参照できない...

残念なことに、objective-Cからswiftのstructは参照することができません。
原因は、structはクラスじゃないからです。

Objective-CはNSObjectのクラスじゃないと参照できません。

objective-CはNSObjectじゃないクラスは参照できません。
クラスでもないstructは、参照対象にならないのです。

まとめ

objective-Cとswiftの共存のための話を書きましたが、
世の中的には、iOSのコードは基本全部swift化することが推奨されるようです。
新しくiosの勉強する人はぜひswiftの勉強に集中してください。