Posted at

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

More than 1 year has passed since last update.

単純に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の勉強に集中してください。