SwiftでC++のコードを使う方法
SwiftでC++のコードを使う場合、Objective-C++でラップして呼び出す必要がある。具体的には以下の手順が必要となる。
- C++ファイル、C++ヘッダファイルを作成
- C++をラップするObjective-C++ファイル、Objective-C++ヘッダファイルを作成
- ObjectiveC++ブリッジファイルでObjective-C++ヘッダファイルをインポート
- SwiftからObjective-C++のラップ関数を呼び出す
C++ファイルの作成
まずは、New File...からC++ファイルを作成する。この時、"Also create a header file" を選択すると、ヘッダファイルも同時に作成される。
また、C++ファイルの初回作成時には、ブリッジヘッダファイルも同時に作成してくれる。
今回はSocketControllerというクラスを作って、testメソッドを実装する。
SocketControllerCpp.hpp
#ifndef SocketControllerCpp_hpp #define SocketControllerCpp_hpp #include <stdio.h> class SocketControllerCpp { public: void test(void); }; #endif /* SocketControllerCpp_hpp */
SocketControllerCpp.cpp
#include "SocketControllerCpp.hpp" void SocketControllerCpp::test(void) { printf("Hello C++"); }
Objective-C++ファイルの作成
次に、C++のコードをラップするObjective-C++ファイルを作成する。
同じく、NewFile...からC++ファイルを作成する。
ヘッダファイルはSocketControllerObjC.h、実装ファイルはSocketControllerObjC.mmとする。
ラップクラス内ではC++クラスをnewし、testメソッドを呼び出す。
SocketControllerObjC.h
#ifndef SocketControllerObjC_hpp #define SocketControllerObjC_hpp #import <Foundation/Foundation.h> @interface SocketControllerObjC : NSObject - (void) test; @end #endif /* SocketControllerObjC_hpp */
SocketControllerObjC.mm
#include "SocketControllerObjC.h" #include "SocketControllerCpp.hpp" @implementation SocketControllerObjC { SocketControllerCpp *socketController; } -(id)init { self = [super init]; socketController = new SocketControllerCpp(); return self; } -(void)dealloc { delete socketController; //[super dealloc]; } -(void)test { socketController->test(); } @end
Objective-C++ブリッジファイルの作成
ブリッジファイルは初回のC++ファイル作成時に一緒に作成されている。
ここではObjective-C++ファイルのインポートを行う。
プロジェクト名-Bridging-Header.h
#import "SocketControllerObjC.h"