LoginSignup
9
4

More than 5 years have passed since last update.

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

Posted at

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

9
4
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
9
4