在理解完 Objective-C 之後,我们要来面对 C 语言的引用,不得不说 Swift 十分不信任 C 语言,看看那个UnsafePointer
就知道了。
当我们使用 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 语言的编译过程中有所谓的 linker 阶段,在 clang 可以将单个 .c
档案编译为 .o
档案。
clang -c CFunctions.c -o CFunctions.o
透过使用 -c
的参数指定 compile 成 obj 档案,而这个 Obj 档案可以保留作为节省编译资源的方式(时间与电量)。
而 .a
是透过 ar
指令将指定的 obj 档案建立为静态函式库。
关於 静态函式库与共享函式库,参考 Static library - Wikipedia
在使用 C 的静态函式库时,我们可以用 Framework, Libaraies, and Embedded Content 来使用,目前我实作了
rderik/Csqlite3 - GitHub 是可以使用的,其中 Sources/module.modulemap
内使用的是来自系统的 header。
然而我尝试透过 ar
建立静态函式库并应用进来 modulemap 时,header 的 obj 却遗失导致无法编译成功。由於截稿压力无法完成研究。
在使用 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
char*
的长度 (length)? 这与 Swift 的 String count 有区别,那区别是什麽?
>>: 【少女人妻的30天Elastic】Day 29 : App Search_API 介绍与应用_Curations
前言 上回说到 CI/CD 的第一步会是 Build ,今天就来实际了解如何建置 Build Sta...
tags: OC 30 day 1. 内存中的五大区域: 栈 储存局部变量。 堆 工程师手动申请的字...
前言 昨天讲了 display 当中的 Flex 属性 那今天就要来讲 display 当中的 Ju...
为了Google的icon还有未来应该会需要加入一些icon所以安装个好用的python包 cons...
故事从微微软家飘出硬塞的会员可下载 Win11 体验说起 微软(Microsoft)日前发表最新作业...