2017-04-04 17 views
2

iOSとAndroidネイティブのアプリを作成したい(これまでXamarinを使用していましたが、もう使用したくないので)、私の次の選択肢は、コンパイルできる共有コードをC++で作成することでした両方のプラットフォームでネイティブにSwiftからC++を直接使用できますか?

今すぐSwiftからC++を直接使用できるかどうかを知りたいです。私が見つけた唯一の解決策は、Objective-C++でラッパーを作成し、それをブリッジヘッダーで公開することを提案しますが、このオーバーヘッドは必要ありません。

これはSwiftを予定していますか?または、Objective-C++のステップをスキップする他のソリューションがありますか?

+0

関連するhttp://stackoverflow.com/questions/24042774/can-i-mix-swift-with-c-like-the-objective-c-mm-files –

+0

[SwiftとC++を混在させることはできますか? Objective - C。mmファイルのように](http://stackoverflow.com/questions/24042774/can-i-mix-swift-with-c-like-the-objective-c-mm-files) –

答えて

0

C++ヘッダーをBridging-Header.hにC互換にすると、迅速なプロジェクトでシームレスに使用できます。

#ifndef Bridging_Header_h 
#define Bridging_Header_h 

#import <Foundation/Foundation.h> 
#include "CPlusPlusHeader.h" 


#endif /* Bridging_Header_h */ 
+0

キャッチとは?私はこれが可能であることを知らなかった。 – vrwim

+0

キーは、 'extern" C "{}"のトリックと互換性があるとマークされたC互換のC++ヘッダをインクルードするObjective-Cブリッジヘッダを作ることです。 – zero3nna

+2

これは、 'extern" C "関数を呼び出し、C互換型を使用することのみを可能にすることに注意してください。 C++のクラスまたはC++の他の非互換機能を直接使用することはできません。 –

2

これは現在サポートされていません。スウィフトコードからC++コードに話のための唯一の2つのアプローチがあります。

  1. すでに見られるように、Objective-Cの++を使用してにObjCのあなたのC++コードをラップします。

  2. C++は主にCと互換性があり、SwiftはCを呼び出して、C++クラスの周りにCラッパーを作成し、Swiftから使用することができます。一般的なアプローチは次のようになります。

cppwrapper.h

struct MyCppClass; // In C++ class and struct are the same, so this looks like a C struct to C, and as long as you don't look inside it, you can use pointers to it in C code. 

extern "C" { // Tell C++ to turn off overloading based on type so it's C-compatible. 

struct MyCppClass* MyCppClass_new(int firstParam); 
void MyCppClass_delete(struct MyCppClass* inThis); 
void MyCppClass_setFirstParam(struct MyCppClass* inThis, int firstParam); 

} // extern "C" 

cppwrapper.cpp

#include "cppwrapper.h" 
#include "MyCppClass.hpp"  

extern "C" MyCppClass* MyCppClass_new(int firstParam) 
{ 
    return new MyCppClass(firstParam); 
} 

extern "C" void MyCppClass_delete(MyCppClass* inThis) 
{ 
    delete inThis; 
} 

extern "C" void MyCppClass_setFirstParam(struct MyCppClass* inThis, int firstParam) 
{ 
    inThis->SetFirstParam(firstParam); 
} 

あなたは、その後も、内型COpaquePointerのインスタンス変数を持つMyCppClassSwiftWrapperを定義することができますC++オブジェクトを格納します。このクラスはコンストラクタでMyCppClass_newをデストラクタのMyCppClass_deleteを呼び出し、パラメータとしてCOpaquePointerを使用するMyCppClass_setFirstParamのラッパを含みます。

私はかつてC++ヘッダーをマークアップして自動的にCおよびSwiftラッパーを生成する(非常にプリミティブな)ユーティリティを作成しましたが(https://github.com/uliwitness/cpptoswift/)、テンプレートでは機能しません。型マッピングまた、まだC++オブジェクトのパッシング/リターンを正しく処理することもできません。

さらに良いことがあるhttps://github.com/sandym/swiftpp/もありますが、Objective-Cがラッパーのフードの下でまだ使用されていますが、少なくとも自分で書く必要はありません。

関連する問題