公司的 CI 终于升级到了 Xcode 9,所以项目的代码也可以升级一下 Swift 4 了。因为 Xcode 9 是支持 Swift 4 和 Swift 3.2 同时存在的,如果你所有依赖的第三方库都能够支持到 Swift 3.2 及以上,那你的项目就能无痛升级了。如果真的希望一半是 3.2 一半是 4,可以通过这样更改 Podfile 实现这种需求。

使用 Xcode 提供的转换工具 Edit - Conver - To current Swift syntax…,勾选默认的选项 Minimize Inference,就可以开始进行编译器辅助地转换流程了。这还可以减少一定的包大小,为什么呢?

对于 Objective-C 和 Swift 混合的项目,在 Objective-C 调用 Swift 代码之前是需要引用 xxx-Swift.h 头文件的,这个文件是由编译器动态生成的。在 Swift 4 之前,也就是对应下面的 Match Swift 3 Behavior ,编译器会无脑推断,把所有的 pulic 属性和方法暴露给 Objective-C,也就是会有很多 xxx-Swift.h 而且每个都很大。但是 Swift 4 中变得严格了,只有被标记为 @objc 的方法和属性才会暴露给 Objective-C。通过这种方式,可以减少一些代码的生成,从而减少包大小。

Minimize Inference

点击 Next。经过一段漫长的等待(需要一次完整的编译),编译器会帮你把项目中它能转换的代码都转换了,顺便把工程设置中的 Build Setting - Swift version 改为 4。但你以为这样就大功告成了吗?Too yong!编译器能帮你做的只是一些微小的工作,而且它还可能给你改错!一定要在它改完之后再检查一次,以免发生错误。再 build 一次你就会发现大量的 error,尤其是一个 Objective-C 和 Swift 混合的项目,升级 Swift 4 就是一个不停在 Swift 属性和方法名前加 @objc 的过程,加到你怀疑人生。。

Reference