前言
swift作為蘋果的親兒子导披。吸收了各大語言的優(yōu)點(diǎn), 不僅擁有解釋語言的效率怀挠,又能直接操作內(nèi)存析蝴,兼容C,接近C語言的性能绿淋。
如果能夠在swift中使用c++闷畸,那么對于swift來說更是如虎添翼。
搭建環(huán)境
可以先下載這個(gè)demo吞滞。
目錄結(jié)構(gòu)大概是這樣的
我們會把c++文件寫在framework中佑菩,方便其他的工程去調(diào)用。
首先新建一組c++文件:
在Person.hpp中
#ifndef Person_hpp
#define Person_hpp
#include <stdio.h>
#include <iostream>
using namespace std;
class Person {
public:
string name;
int age;
bool sex;
public:
//默認(rèn)構(gòu)造函數(shù)冯吓,相當(dāng)于init
Person();
//帶參數(shù)的構(gòu)造函數(shù)倘待,相當(dāng)于帶參數(shù)的init
Person(const char* name , const int age , const bool sex);
//析構(gòu)函數(shù),用來釋放資源组贺,相當(dāng)于deinit
~Person();
//自我介紹
void introduceMySelf();
};
#endif /* Person_hpp */
在Person.cpp中實(shí)現(xiàn)Person類里面的方法
#include "Person.hpp"
Person::Person(){
age = 0;
sex = true;
name = "who?";
}
Person::Person(const char* name , const int age , const bool sex){
this->age = age;
this->sex = sex;
long len = strlen(name);
char * cpname = new char[len + 1];
strcpy(cpname, name);
this->name = cpname;
}
Person::~Person(){
cout << "person destruct\n";
}
void Person::introduceMySelf(){
cout << "hello , i am " << name << ", my age is " << age << "year";
if (sex) {
cout << "i am boy";
}else{
cout << "i am girl";
}
}
如何在swift中去調(diào)用cpp的類了凸舵?
首先,在swift中是不能去調(diào)用c++的代碼的失尖。但是swift可以調(diào)用c代碼的啊奄,c可以調(diào)用c++。我們可以通過c這個(gè)中間代碼掀潮,讓swift可以去間接的調(diào)用c++菇夸。
我們先新建一個(gè)C的頭文件:
#ifndef PersonExtern_h
#define PersonExtern_h
#ifdef __cplusplus
extern "C"{
#endif
//在這里寫上c的代碼
//初始化一個(gè)Person的實(shí)例
#ifdef __cplusplus
}
#endif
#endif /* PersonExtern_h */
#ifdef __cplusplus
是個(gè)宏定義,表示c++編譯器在這里以c++的方式編譯仪吧,c編譯器在這里以c的方式編譯庄新。
讓在Person.cpp 中實(shí)現(xiàn)PersonExtern.h聲明的方法:
ps: 因?yàn)樵赾中不能使用c++中的Person類型,所以我們使用通用類型void
接下來就是在swift中調(diào)用PersonExtern.h的方法了。
在framework中择诈,我們是不能使用橋接頭文件的方式來調(diào)用c文件中的方法械蹋。
ps : 在工程中, 我們可以使用橋接頭文件(就是新建oc文件出現(xiàn)了的那個(gè)橋接文件)羞芍。但是framework中不行哗戈。
步驟:
- 新建一個(gè)module.map
-
SwiftCppKit
- 在SwiftCppKit -> Build Settings 中搜索 import path
- 添加路徑
- 新建一個(gè)全局頭文件SwiftCpp-PCH.h 在這個(gè)全局頭文件中添加我們寫好的c頭文件
- 在module.map 中寫上(這個(gè)截圖有點(diǎn)小失誤,最后我改成了SwiftCppExtern荷科,這里你寫的SwiftCppExtern在swift文件就import SwiftCppExtern. 寫的SwiftCpp唯咬,就import SwiftCpp)
- 最后一步 新建一個(gè)Person.swift文件 然后在swift文件中 import SwiftCppExtern就可以了
接下來就開始在swift里間接調(diào)用c++了
在這之前我們可以
這么做是為了 代碼閱讀更加方便。
1. swift中的代碼(注意寫上open 和 public):
2. 我嘗試在工程中是否能夠使用
3. 接下來嘗試帶參構(gòu)造器和析構(gòu)函數(shù)
用swift來管理c++的生命周期, 是不是讓c++變簡單了許多
4. 最后在測試一個(gè)帶參數(shù)的函數(shù)
完整的工程在這里畏浆,覺得還不錯的話就點(diǎn)個(gè)贊吧胆胰。