本程序示範瞭如何用Swift調用自定義C語言模塊的方法。您能夠直接在github下載本程序,或者按照如下教程逐步完成。git
示範程序中有一個C語言的源程序CSwift.C和一個頭文件CSwift.h,咱們的目標是構造一個CSwift的函數庫,可以讓swift源程序執行CSwift程序中的函數。github
本程序須要Swift 3.0以上版本。編程
下載、編譯和測試swift
$ git clone https://github.com/RockfordWei/CSwift.git $ cd CSwift $ swift build $ swift test
源程序採用C語言寫成,測試程序則是Swift語言編寫。所以若是經過測試,則恭喜您,已經成功實現了Swift語言調用C語言的整個過程。xcode
您能夠徹底不依賴全部上述內容,而一步一步從零開始製做C函數庫和調用C庫的Swift代碼:bash
仍然假定函數庫名稱爲CSwift。首先找一個空白目錄,而後執行:微信
$ mkdir CSwift $ cd CSwift $ swift package init --type=system-module $ mkdir CSwift $ cd CSwift $ swift package init $ mv Tests .. $ mkdir include $ mv ../module.modulemap inlcude/ $ rm Package.swift $ rm -rf Sources $ echo > CSwift.c $ echo > include/CSwift.h $ cd ..
細心的讀者會發現,上面的bash 命令行在CSwift 文件夾下面創建了第二個CSwift文件夾,可是使用了不一樣的swift package
了命令。第一個命令是「建立swift空白項目,並且項目類型是系統模塊」;而第二個命令是「建立swift 空白項目,項目類型是函數庫」。這種作法主要是爲了可以在同一個項目中用Swift去測試C語言的模塊。其次,在第二個CSwift 子目錄下,還創建了一個include 文件夾,並分別創建了兩個空白源程序文件 CSwift.c 和 CSwift.h函數
下一步是修理一下目標的模塊映射表。請把module.modulemap修改成以下程序:測試
module CSwift [system] { header "CSwift.h" link "CSwift" export * }
好了,如今請在Source文件夾下面創建兩個C語言文件:CSwift.c和CSwift.h,內容以下:ui
CSwift/CSwift/include/CSwift.h
extern int c_add(int, int); #define C_TEN 10
CSwift/CSwift/CSwift.c
#include "include/CSwift.h" int c_add(int a, int b) { return a + b ; }
到此爲止,C語言函數庫就應該準備好了。
請修改Tests/CSwiftTests/CSwiftTests.swift文件,內容以下:
import XCTest@testable import CSwift class CSwiftTests: XCTestCase { func testExample() { // 測試調用 C 函數 let three = c_add(1, 2) XCTAssertEqual(three, 3) // 測試調用 C 語言的符號 XCTAssertEqual(C_TEN, 10) } static var allTests : [(String, (CSwiftTests) -> () throws -> Void)] { return [ ("testExample", testExample), ] } }
最後一步最簡單,直接執行:
$ swift build $ swift test
若是沒有問題,那就一切OK了!
若是您在使用Xcode,則須要使用swift package generate-xcodeproj,可是須要調整上述build.lib.sh內容的編譯目標目錄,並配合Xcode偏好設置選擇匹配的目錄,不然沒法測試。
長按二維碼關注Perfect 官網
微信號:PerfectlySoft (公司名)
若是須要幫助,請註冊咱們在Slack上的中文頻道: http://perfect.ly/