SwiftでC++のコードを使う方法

SwiftC++のコードを使う場合、Objective-C++でラップして呼び出す必要がある。具体的には以下の手順が必要となる。

  1. C++ファイル、C++ヘッダファイルを作成
  2. C++をラップするObjective-C++ファイル、Objective-C++ヘッダファイルを作成
  3. ObjectiveC++ブリッジファイルでObjective-C++ヘッダファイルをインポート
  4. 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"

Swiftからのメソッド呼び出し

あとは、SwiftからObjective-C++ラップクラスを呼び出すと、ラップしたメソッドを通してC++メソッドを使うことができる。
ViewControllerから呼び出した場合。

override func viewDidLoad() {
    super.viewDidLoad()
    let socketController = SocketControllerObjC();
    socketController.test();
}