migrate-to-swift4

Swift4 的迁移

对于 apple 发布的 Swift4, 相对于 Swift3, 做了很多稳定性的工作, 但是也提供了很多很方便的特性, 增强了原来 Swift3 上不那么方便使用的东西, 诸如 Codable, Smart Keypaths 还有对于 Swift 类型的KVO&KVC

之前 Swift3 的KVO 只能是继承自 NSObject 的类, 而且还要做 @dynamic 的声明, 这次的扩展, 是的所有的 Swift 的类都能KVO 了, 而且不用做过多的声明, 本篇就不展开了, 绝对值得升级到 Swift4的! 不得不说这是一个很好很方便的东西.! 斯巴拉西!

原材料

一个 Swift3 项目, 正常的, 能编译能运行的那种~

建议: 如果你已有的项目很大很多的话, 在能跑起来的基础上, 选取 code 有代表性的一个模块, 作为一个小项目进行迁移, 这样应该能小成本进行试水, 然后把一些注意点能尽快的定位到, 在运用到原来的项目时就不会这么痛苦和困难

步奏

因为没有使用 CocoaPod 项目已经很少了, 我们迁移不能不考虑到对CocoaPod在这环境的迁移, 有时候我们对这种事情很吃力, 一个是其他 lib 的不可控, 一个是整合的方式, 如果在深层一点的地方出问题, 无疑会付出更大的成本迁移

我们先 迁移项目本身, 再迁移CocoaPods 依赖的库, 这样能先保证自己的没问题

第一步:

添加下列代码到Podfile, 执行pod install

1
2
3
4
5
6
7
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end

这里可以宝成 pod 使用 Swift3.2 来变异依赖的库, 和之前一样

第二步

在项目中切换语言环境, Xcode 提供了自动转换方法, 让项目中的 Swift3代码转换到 Swift4

Click on Edit -> Convert -> Convert to current swift syntax

然后会弹出一个确认框, 其中包括了 pods 库在内的target

!注意!: 只勾选你项目本身, UITest, Unit Testtarget, 其他的都不勾选

然后点击convert

等待项目编译并生成一个预览(告诉你有哪些改变), 然后运用这些改变apply the chnages

修复所有由 Swift4 引起的错误和警告, 有什么疑问的, 可以看迁移指导 (或者自行搜索~)

第三步

更新 pods

这大概是最复杂的一步了, 你必须检查哪个库已经适配了 Swift4, 那些库还只能是 Swift3

在做这步之前, 先提交一次, 以免出了什么问题, 还能回到没问题的状态

然后移除在第一步在podfile 添加的代码段, 运行 pod update, 幸运的话全部依赖的库都支持了 Swift4, 整个项目能编译通过.

不然…如果某个 pod 库编译失败了, 去看看这个类库的 github 主页看看是否升级了 Swift4, 如果支持了, 就去看看 pod 的 project, 选中失败的target, 到build setting 看看, 确认Swift 语言版本已经设置到 Swift4.

重复这个检查, 知道项目能成功 build.

最后, 你可能会有些库是用 Swift4编译, 有些是用 Swift3, 为了避免没次运行 pod 命令时重复去 setting 设置这些, 我们可以再Podfile 最后添加以下代码段

1
2
3
4
5
6
7
8
9
post_install do |installer|
installer.pods_project.targets.each do |target|
if ['Kingfisher', 'RxSwift', 'RxCocoa'].include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
end

这里你可以指定哪些库需要 Swift3 编译

最后

最后你应该可以正常了, 但是还是可能会因为某些 Pod 库存在一些问题

参考博文