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

前言

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

搭建環(huán)境

可以先下載這個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:
    //默認構(gòu)造函數(shù),相當于init
    Person();
    //帶參數(shù)的構(gòu)造函數(shù),相當于帶參數(shù)的init
    Person(const char* name , const int age , const bool sex);
    //析構(gòu)函數(shù),用來釋放資源,相當于deinit
    ~Person();
   
    //自我介紹
    void introduceMySelf();
    
};


#endif /* Person_hpp */

在Person.cpp中實現(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這個中間代碼,讓swift可以去間接的調(diào)用c++。

我們先新建一個C的頭文件:

QQ20170604-162508.png
#ifndef PersonExtern_h
#define PersonExtern_h


#ifdef __cplusplus
extern "C"{
#endif
    //在這里寫上c的代碼
    
    //初始化一個Person的實例
 
#ifdef __cplusplus
}
#endif

#endif /* PersonExtern_h */

#ifdef __cplusplus是個宏定義,表示c++編譯器在這里以c++的方式編譯,c編譯器在這里以c的方式編譯。

QQ20170604-165934.png

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

QQ20170604-170407.png
ps: 因為在c中不能使用c++中的Person類型,所以我們使用通用類型void

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

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

步驟:

  1. 新建一個module.map
  2. SwiftCppKit


    QQ20170604-202915.png
  3. 在SwiftCppKit -> Build Settings 中搜索 import path
QQ20170604-203052.png
  1. 添加路徑
QQ20170604-203241.png
  1. 新建一個全局頭文件SwiftCpp-PCH.h 在這個全局頭文件中添加我們寫好的c頭文件
QQ20170604-203709.png
  1. 在module.map 中寫上(這個截圖有點小失誤,最后我改成了SwiftCppExtern,這里你寫的SwiftCppExtern在swift文件就import SwiftCppExtern. 寫的SwiftCpp,就import SwiftCpp)
QQ20170604-203941.png
  1. 最后一步 新建一個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. 最后在測試一個帶參數(shù)的函數(shù)

QQ20170604-213505.png

完整的工程在這里,覺得還不錯的話就點個贊吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容