SwiftとObjective-C/C++とC++を相互利用する

SwiftからC++を使う

言語仕様上SwiftからC++を使うには、Objective-Cppを使用して接続するしかない。
しかし、シンプルに使うことできる。

まずは、プロジェクトにこれを作る

HeaderFile
${プロジェクト名}-Bridging-Header.h
MEMO
プロジェクトに.cのファイルを作成しようとするとXcodeが自動生成してくれるので簡単。

仮に自動じゃなくても、ヘッダーファイルを作って、ここにファイルパスを追加すれば良い。

Xcode
Build Settings > Swift Compiler - General > Objective-C Bridging Header

例えばこんな感じ。

Path
${PROJECT_DIR}/path/to/$(SWIFT_MODULE_NAME)-Bridging-Header.h

あとは、設定したヘッダーファイルに、使いたいC++をラップしたObjCppのヘッダーファイルをインポートするだけ。
例えばこんな感じ。

Objective-C
#import "hoge.h"

以上の方法を踏めば、簡単にSwiftからC++のクラスやメソッドを呼び出せる。

Objective-C/C++からSwiftを使う

使うユーザも少ない(ほぼいない)し、これを紹介している文献も少ない。
Xcodeの機能で、Swiftとのインターフェイスを自動生成する機能があるためそれを使う。

まずは、Inferface Header Nameが設定されていることを確認する。

具体的にはここに$(SWIFT_MODULE_NAME)-Swift.hが設定されていることを確認する。

Path
Build Settings > Swift Compiler - General > Objective-C Generated Interface Header Name

ファイル自体は自動的に生成されるので、そのままこれを入力すれば良い。

Path
$(SWIFT_MODULE_NAME)-Swift.h

プロジェクトのビルドが成功すると、ここに自動的にInferfaceができるらしい。

あとは、使うObjective-C/C++の.mもしくは.mmにこのヘッダーファイルをインポートする

例えばこんな感じ。

Objective-C/C++
#import "path/to/Hoge-Swift.h"

これでSwiftのClassが使えるようになる。

注意
Objective-C上で使えるSwiftのクラスはNSObjectを継承しているクラスのみで、かつ@objcMembersと明示する必要がある。

例えばこんな感じ。

Swift
@objcMembers
final class Hoge: NSObject {}

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください