本程序示范了如何用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/