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 或 本...

更友好的 warning 消除方案

对于编译型语言,开启编译器的「Treat Warnings as Errors」是非常有益的。它把 warning 当做错误,会中断编译,强制我们修复问题。在没有开启这个功能的时候,warning 会随着开发不断积累增多。当数量很多的时候,新增的 warning 不容易被发现,从而掩盖问题。 对于一个自律的独立开发者,这个问题是可以避免的,但多人协作的情况下,需要「Treat Warnings as Errors」这样强制的功能来保障。 但是它有一个问题: 对于开发和调试不太友好。在编译一些未完成的代码的时候非常容易出现 warning,而这些 warning 没有任何实际意义。比如...