编译一个向后兼容的 swift 二进制库

Swift 5.0 实现了 ABI 稳定,使用 Swift 5.0 编译器编译出的二进制文件,可以被未来的版本所使用。但在使用 5.0.1 编译器引用一个 5.0 的二进制文件时,熟悉的错误仍然出现:不同编译器的产物不能相互引用。这是因为 swift 5.0 还没有达到 Module Stability。 Module stability 代表着描述模块 API 的信息格式稳定。这个信息会在编译时使用,它表明了这个库所有的类和函数都是什么,如同 c 语言的 header 文件一样。swift 把这个信息存在一个名为 .swiftmodule 的二进制文件中。由于这个文件在不同编译器间不...

Play with Anka: Try to build a dock-like iOS CI environment

Containerization is convenient for service deploying and environment isolating. Docker is a popular one, for Linux. Docker also has a Mac version, but it only provides a Linux container environment, not macOS, which cannot be used for iOS project building. (Dock for mac just run a Linux virtual m...

一个 iOS 开发者对 web 的窥探

App 开发大家轻车熟路。但是从一个开发 App 起家的人来说,web 开发是一种既陌生又熟悉的领域。熟悉在于开发 UI 程序的整体要素都是相通的:如何构建 UI,请求网络,变换/存储数据。而实现这些东西的方式却很不一样,这与 iOS / Android 之间的差别大很多。 专注一个方面,构建 UI。它的本质都是告诉所在环境(操作系统/浏览器)在屏幕上应该显示什么内容。这里无论是命令式的,还是声明式的都没有本质差别。对于 app 开发,系统提供的是某种编程语言调用的 API。比如在 iOS 中就是以 ObjC 形式提供的类与方法。而 web 提供的 API 则是对 html 文本(以及...

使用泛型构造一个聪明的 JSON 解析库

“Don’t Repeat Yourself” 在 Codable 出现之前,Swift 中把一个 JSON 字典转换成对象的时候,需要手动转换类型: self.address = dictionary["address"] as? String 即使使用了 SwiftyJSON 这样的库,只是方便了书写方式,仍然需要手动指定类型。 其实 self.address 已经在声明的时候指明类型了,提取 JSON 的时候指定类型,在信息上讲完全是冗余的。利用泛型,我们完全可以省略这一步骤: extension Dictionary { func mapValue<T&...

加快 CocoaPods 项目编译时间:Pod 预编译的傻瓜式解决方案

问题 CocoaPods 以源代码的形式集成第三方库,这些库在开发的过程中经常会重新编译。当引用的库数量很多的时候,这个编译时间就会非无法忽略变得非常讨厌。毫无意义,并且降低了工作效率。 加快编译的一个方式是把第三方库全部预编译好,再集成到工程里。但这个过程非常繁琐,要手动编译库建私有仓库,版本更新时又要重做。虽然已有一些方案来解决这个事情,但在前两个问题上处理的都不够好,无法完全做到自动化。 为什么不用 Carthage Carthage 可以集成二进制库,为什么不用呢?有以下几个原因: Pod 是一个简单的易用的组织文件\管理依赖的形式。它可以使用私有 Pod 或 本...