[29] 30 天从 Swift 学会 Objective-C:Swift friendly 的 进阶 C 语言部分与 modulemap

在理解完 Objective-C 之後,我们要来面对 C 语言的引用,不得不说 Swift 十分不信任 C 语言,看看那个UnsafePointer 就知道了。


Photo by @filipz on Unsplash

C 语言程序码汇入到 Swift project

当我们使用 Xcode 在 Swift projcet 建立 C/Objective-C 档案时,Xcode 会提示我们 Xcode 可以自动建立需要的 bridge header

Importing Objective-C into Swift - Apple Developer Documentation
中有这麽一张图:

图片来自 Importing Objective-C into Swift - Apple Developer Documentation

我们可以知道在 C/Objective-C 都是使用 .h 作为 header 的副档名,透过在 bridge Header 内引用相关的Header, Swift 编译器可以确认纳入编译来源的档案。

[进阶] 只有 C 语言的 .h 与 .a

在 C 语言的编译过程中有所谓的 linker 阶段,在 clang 可以将单个 .c 档案编译为 .o 档案。

 clang -c CFunctions.c -o CFunctions.o

透过使用 -c 的参数指定 compile 成 obj 档案,而这个 Obj 档案可以保留作为节省编译资源的方式(时间与电量)。

.a 是透过 ar 指令将指定的 obj 档案建立为静态函式库。

关於 静态函式库与共享函式库,参考 Static library - Wikipedia

[我看不懂的部分] 在 Swift 引入静态函式库

在使用 C 的静态函式库时,我们可以用 Framework, Libaraies, and Embedded Content 来使用,目前我实作了
rderik/Csqlite3 - GitHub 是可以使用的,其中 Sources/module.modulemap 内使用的是来自系统的 header。

范例来自 rderik/Csqlite3 - GitHub

然而我尝试透过 ar 建立静态函式库并应用进来 modulemap 时,header 的 obj 却遗失导致无法编译成功。由於截稿压力无法完成研究。

关於 Swift 不信任 C 语言这件事

在使用 bridge header 引入 C 语言的程序码後,使用 char* 会遇到 UnsafeMutablePointer<Int8>!

这部分我使用的方式时拖过 adapter 的方式,藉由 Swift package 来处理。

程序码范例於 ytyubox/lib_mylib - GitHub

关於这部分的详细解释,我推荐 Cecilia Humlelu 在 App Builders 2019 的介绍

Use C, C++ and Objective C Libraries in a Swift Project - Cecilia Humlelu - App Builders 2019 On Youtube

简单测验

  1. 在 C 语言中,如何判读一个 char* 的长度 (length)? 这与 Swift 的 String count 有区别,那区别是什麽?
  2. modulemap 是 Swift feature 还是 C 语言的?

<<:  VSCode 套件推荐系列

>>:  【少女人妻的30天Elastic】Day 29 : App Search_API 介绍与应用_Curations

Day18 - GitLab CI 自动建置 Docker Image

前言 上回说到 CI/CD 的第一步会是 Build ,今天就来实际了解如何建置 Build Sta...

iOS APP 开发 OC 第七天, 对象在内存中的储存

tags: OC 30 day 1. 内存中的五大区域: 栈 储存局部变量。 堆 工程师手动申请的字...

铁人赛 Day7 -- 一定要知道的 CSS (四) -Justify-content

前言 昨天讲了 display 当中的 Flex 属性 那今天就要来讲 display 当中的 Ju...

D22 Django-bootstrap 网站美化工程 - fontawesomefree icon

为了Google的icon还有未来应该会需要加入一些icon所以安装个好用的python包 cons...

意图下载微微软家的新OS,嚐鲜不成载到加好加满的谜包

故事从微微软家飘出硬塞的会员可下载 Win11 体验说起 微软(Microsoft)日前发表最新作业...