Swift、CとC++のミックス
アップルがSwiftを発売した後、すぐにプログラム猿に人気があり、迅速で安全で簡潔な開発はすでに大きなトレンドとなっている.CとC++を加えると本当にシームレスで、完璧に結合しています.Swift呼び出しCとC++については、通常OCをブリッジ(oc呼び出しcとc++)にする必要があり、性能は最適化されません.今日は直接Swift呼び出しCで性能を全面的に向上させます.アップルはCと同じ速さのSwiftのdemoと呼ばれています. SwiftダイレクトコールC 私たちは直接テーマに入り、SwiftはCを呼び出します.まず、プロジェクトSwitCDemoを作成し、CModelという名前のCファイルを作成します.hファイルは以下の関数を作成する.
はい.cファイルでこの関数を実現する:
私たちは2つのc関数を定義します(cはあまり強くありません.簡単にしか使えません.使えばいいです).私たちは今Swiftで呼び出しています.
ヘッダファイル、すなわち外部(swift)のインタフェースを定義します.CBridging.hという名前の.hファイルを作成します.
上の定義がよくわからなければ、自分でネットで調べて、たくさんの説明があって、私はここであまり言いません.作成時にブリッジファイルを作成するかどうかのヒントがあります.はい、いいえをクリックすると、自分で作成しなければなりません.どうやって作成しますか.文章を推薦する.
ブリッジファイルにCBridgingをインポートする必要があります.h.そして私たちはデフォルトのViewControllerにいます.swiftで動作します.
ログを印刷するには、次のようにします.
これで、C言語の呼び出しに成功しました.c++に対して私たちもこの方法です. Swift呼び出しC++ swiftがc++を呼び出すのはcと同じです.まず、CPPersonという名前のc++ファイルを作成します.
はい.hppにはクラスが宣言されています.
はい.cppではこのクラスを実現します.
私たちはCBridgingにいます.hにc++インタフェースを追加する:
声明を付けてください.
私たちは必要です.cppファイルでは、これらの関数を実装します.
ViewControllerでswift呼び出し C呼び出しSwift swiftがCを呼び出すと、CもSwiftを呼び出すことができます.どうやって呼び出したか見てみましょう.
ブリッジファイルにコールバック関数を宣言します.
CModelでhファイルで初期化
swiftで関数を宣言し、このコールバック関数に値を割り当てます.
テスト呼び出しの関数を書きます.私たちは直接呼び出すことができて、こんなにたくさん言って、少し手がかりがあると信じています.
また、c++はswiftを呼び出し、これは残って考えます.最後にdemoアドレスを添付します.ご指摘を歓迎します.
demoアドレス.
:
Xcode :11.0-beta Swift :5.0
#ifndef CModel_h
#define CModel_h
#include
void printHellow(void);
int getRandomInt(void);
#endif /* CModel_h */
はい.cファイルでこの関数を実現する:
#include "CModel.h"
#include
void printHellow(void){
printf("hellow world,I am is C language");
}
int getRandomInt(void){
return rand();
}
私たちは2つのc関数を定義します(cはあまり強くありません.簡単にしか使えません.使えばいいです).私たちは今Swiftで呼び出しています.
ヘッダファイル、すなわち外部(swift)のインタフェースを定義します.CBridging.hという名前の.hファイルを作成します.
#ifdef __cplusplus
extern "C" {
#endif
void printHellow(void);
int getRandomInt(void);
#ifdef __cplusplus
}
#endif
上の定義がよくわからなければ、自分でネットで調べて、たくさんの説明があって、私はここであまり言いません.作成時にブリッジファイルを作成するかどうかのヒントがあります.はい、いいえをクリックすると、自分で作成しなければなりません.どうやって作成しますか.文章を推薦する.
ブリッジファイルにCBridgingをインポートする必要があります.h.そして私たちはデフォルトのViewControllerにいます.swiftで動作します.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print("
----------------------------
")
printHellow();
let cRandomInt = getRandomInt();
print("
")
print(" C :\(cRandomInt)");
}
}
ログを印刷するには、次のようにします.
----------------------------
hellow world,I am is C languagerecive =16807
これで、C言語の呼び出しに成功しました.c++に対して私たちもこの方法です.
はい.hppにはクラスが宣言されています.
#include
using namespace std;
class CPPerson {
string name;
int age;
bool isNan;
public:
CPPerson();
CPPerson(const char * name,int age, bool isNan);
~CPPerson();
void printPersonInfo();
const char* getPersonName();
};
はい.cppではこのクラスを実現します.
CPPerson::CPPerson(){
this->name = " ";
this->age = 20;
this->isNan = true;
}
CPPerson::CPPerson(const char * name,int age, bool isNan){
this->name = name;
this->age = age;
this->isNan = isNan;
}
void CPPerson::printPersonInfo(){
cout << "i am is" << name << ",my age is "<< age;
if (isNan) {
cout << "i am a body";
}else{
cout << "i am a girl";
}
}
const char* CPPerson::getPersonName() {
return name.data();
}
CPPerson::~CPPerson(){
cout << " ";
}
私たちはCBridgingにいます.hにc++インタフェースを追加する:
CPersonModel create();
CPersonModel createBy(const char* name,int age);
void printPersonInfo(CPersonModel model);
const char* getPersonName(CPersonModel model);
void destoryModel(CPersonModel model);
声明を付けてください.
typedef void* CPersonModel;
私たちは必要です.cppファイルでは、これらの関数を実装します.
CPersonModel create() {
return new CPPerson();
}
CPersonModel createBy(const char* name,int age){
return new CPPerson(name,age,true);
}
void printPersonInfo(CPersonModel model) {
CPPerson *p = (CPPerson*)model;
p->printPersonInfo();
}
const char* getPersonName(CPersonModel model){
CPPerson *p = (CPPerson*)model;
return p->getPersonName();
}
void destoryModel(CPersonModel model){
CPPerson *p = (CPPerson*)model;
delete p;
}
ViewControllerでswift呼び出し
let person = createBy("peter", 14);
printPersonInfo(person);
let cName = getPersonName(person);
let name = String(cString: cName!);
print("fetch name is:\(name)");
destoryModel(person);
ブリッジファイルにコールバック関数を宣言します.
extern void(^ __nonnull swiftFuncIMP)(int);
CModelでhファイルで初期化
void(^ __nonnull swiftFuncIMP)(int) = NULL;
swiftで関数を宣言し、このコールバック関数に値を割り当てます.
func swiftFunImplement(a:Int32) -> Void {
print(" c Int ->\(a)");
}
テスト呼び出しの関数を書きます.私たちは直接呼び出すことができて、こんなにたくさん言って、少し手がかりがあると信じています.
また、c++はswiftを呼び出し、これは残って考えます.最後にdemoアドレスを添付します.ご指摘を歓迎します.
demoアドレス.