Swift中如何正確的使用C++

前言

swift作為蘋果的親兒子导披。吸收了各大語言的優(yōu)點(diǎn), 不僅擁有解釋語言的效率怀挠,又能直接操作內(nèi)存析蝴,兼容C,接近C語言的性能绿淋。
如果能夠在swift中使用c++闷畸,那么對于swift來說更是如虎添翼。

搭建環(huán)境

可以先下載這個(gè)demo吞滞。
目錄結(jié)構(gòu)大概是這樣的

QQ20170604-155454.png

我們會把c++文件寫在framework中佑菩,方便其他的工程去調(diào)用。

首先新建一組c++文件:

QQ20170604-155828.png

在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的頭文件:

QQ20170604-162508.png
#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的方式編譯庄新。

QQ20170604-165934.png

讓在Person.cpp 中實(shí)現(xiàn)PersonExtern.h聲明的方法:

QQ20170604-170407.png
ps: 因?yàn)樵赾中不能使用c++中的Person類型,所以我們使用通用類型void

接下來就是在swift中調(diào)用PersonExtern.h的方法了。

在framework中择诈,我們是不能使用橋接頭文件的方式來調(diào)用c文件中的方法械蹋。
ps : 在工程中, 我們可以使用橋接頭文件(就是新建oc文件出現(xiàn)了的那個(gè)橋接文件)羞芍。但是framework中不行哗戈。

步驟:

  1. 新建一個(gè)module.map
  2. SwiftCppKit


    QQ20170604-202915.png
  3. 在SwiftCppKit -> Build Settings 中搜索 import path
QQ20170604-203052.png
  1. 添加路徑
QQ20170604-203241.png
  1. 新建一個(gè)全局頭文件SwiftCpp-PCH.h 在這個(gè)全局頭文件中添加我們寫好的c頭文件
QQ20170604-203709.png
  1. 在module.map 中寫上(這個(gè)截圖有點(diǎn)小失誤,最后我改成了SwiftCppExtern荷科,這里你寫的SwiftCppExtern在swift文件就import SwiftCppExtern. 寫的SwiftCpp唯咬,就import SwiftCpp)
QQ20170604-203941.png
  1. 最后一步 新建一個(gè)Person.swift文件 然后在swift文件中 import SwiftCppExtern就可以了
QQ20170604-204315.png

接下來就開始在swift里間接調(diào)用c++了

在這之前我們可以


QQ20170604-204907.png

這么做是為了 代碼閱讀更加方便。

1. swift中的代碼(注意寫上open 和 public):

QQ20170604-205537.png

2. 我嘗試在工程中是否能夠使用

QQ20170604-205842.png

3. 接下來嘗試帶參構(gòu)造器和析構(gòu)函數(shù)

QQ20170604-212419.png

用swift來管理c++的生命周期, 是不是讓c++變簡單了許多

4. 最后在測試一個(gè)帶參數(shù)的函數(shù)

QQ20170604-213505.png

完整的工程在這里畏浆,覺得還不錯的話就點(diǎn)個(gè)贊吧胆胰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市全度,隨后出現(xiàn)的幾起案子煮剧,更是在濱河造成了極大的恐慌,老刑警劉巖将鸵,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勉盅,死亡現(xiàn)場離奇詭異,居然都是意外死亡顶掉,警方通過查閱死者的電腦和手機(jī)草娜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痒筒,“玉大人宰闰,你說我怎么就攤上這事〔就福” “怎么了移袍?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長老充。 經(jīng)常有香客問我葡盗,道長,這世上最難降的妖魔是什么啡浊? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任觅够,我火速辦了婚禮,結(jié)果婚禮上巷嚣,老公的妹妹穿的比我還像新娘喘先。我一直安慰自己,他們只是感情好廷粒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布窘拯。 她就那樣靜靜地躺著红且,像睡著了一般。 火紅的嫁衣襯著肌膚如雪树枫。 梳的紋絲不亂的頭發(fā)上直焙,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天景东,我揣著相機(jī)與錄音砂轻,去河邊找鬼。 笑死斤吐,一個(gè)胖子當(dāng)著我的面吹牛搔涝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播和措,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼庄呈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了派阱?” 一聲冷哼從身側(cè)響起诬留,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贫母,沒想到半個(gè)月后文兑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腺劣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年绿贞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橘原。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡籍铁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趾断,到底是詐尸還是另有隱情拒名,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布芋酌,位于F島的核電站增显,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隔嫡。R本人自食惡果不足惜甸怕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腮恩。 院中可真熱鬧梢杭,春花似錦、人聲如沸秸滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咒唆,卻和暖如春届垫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背全释。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工装处, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浸船。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓妄迁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親李命。 傳聞我的和親對象是個(gè)殘疾皇子登淘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容