前言
swift作為蘋果的親兒子。吸收了各大語言的優點, 不僅擁有解釋語言的效率,又能直接操作內存,兼容C,接近C語言的性能。
如果能夠在swift中使用c++,那么對于swift來說更是如虎添翼。
搭建環境
可以先下載這個demo。
目錄結構大概是這樣的
QQ20170604-155454.png
我們會把c++文件寫在framework中,方便其他的工程去調用。
首先新建一組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:
//默認構造函數,相當于init
Person();
//帶參數的構造函數,相當于帶參數的init
Person(const char* name , const int age , const bool sex);
//析構函數,用來釋放資源,相當于deinit
~Person();
//自我介紹
void introduceMySelf();
};
#endif /* Person_hpp */
在Person.cpp中實現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中去調用cpp的類了?
首先,在swift中是不能去調用c++的代碼的。但是swift可以調用c代碼的,c可以調用c++。我們可以通過c這個中間代碼,讓swift可以去間接的調用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 中實現PersonExtern.h聲明的方法:
QQ20170604-170407.png
ps: 因為在c中不能使用c++中的Person類型,所以我們使用通用類型void
接下來就是在swift中調用PersonExtern.h的方法了。
在framework中,我們是不能使用橋接頭文件的方式來調用c文件中的方法。
ps : 在工程中, 我們可以使用橋接頭文件(就是新建oc文件出現了的那個橋接文件)。但是framework中不行。
步驟:
- 新建一個module.map
-
SwiftCppKit
QQ20170604-202915.png - 在SwiftCppKit -> Build Settings 中搜索 import path
QQ20170604-203052.png
- 添加路徑
QQ20170604-203241.png
- 新建一個全局頭文件SwiftCpp-PCH.h 在這個全局頭文件中添加我們寫好的c頭文件
QQ20170604-203709.png
- 在module.map 中寫上(這個截圖有點小失誤,最后我改成了SwiftCppExtern,這里你寫的SwiftCppExtern在swift文件就import SwiftCppExtern. 寫的SwiftCpp,就import SwiftCpp)
QQ20170604-203941.png
- 最后一步 新建一個Person.swift文件 然后在swift文件中 import SwiftCppExtern就可以了
QQ20170604-204315.png
接下來就開始在swift里間接調用c++了
在這之前我們可以
QQ20170604-204907.png
這么做是為了 代碼閱讀更加方便。
1. swift中的代碼(注意寫上open 和 public):
QQ20170604-205537.png
2. 我嘗試在工程中是否能夠使用
QQ20170604-205842.png
3. 接下來嘗試帶參構造器和析構函數
QQ20170604-212419.png
用swift來管理c++的生命周期, 是不是讓c++變簡單了許多
4. 最后在測試一個帶參數的函數
QQ20170604-213505.png
完整的工程在這里,覺得還不錯的話就點個贊吧。