# Swift 版本迁移问题总结 > 工程中存在一部分代码逻辑是 Swift 实现的,每次 Swift 版本升级、Xcode 版本升级或许意味着你需要对 Swfit 实现的这部分代码进行升级改动,此篇文章就记录 Swift 每次升级时踩过的坑 ## Swift 5 && Xcode 10.2 的踩坑 1. 一部分改动是由于系统通知的名称改变造成的 | 改动前 | 改动后 | |:--:|:--:| | .UIKeyboardWillShow | UIResponder.keyboardWillShowNotification | | UIAlertControllerStyle.alert | UIAlertController.Style.alert | | UIAlertActionStyle.cancel | UIAlertAction.Style.alert | | UIControlState.normal | UIControl.State.normal | | UIEdgeInsetsMake(0, 20, 0, 20) | UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) | | XQNetworkingManager.jsonManager | XQNetworkingManager.useJSONSerializer | | NSNotification.Name.UITextFieldTextDidChange | UITextField.textDidChangeNotification | 2. 当你修改完语法问题的时候,编译工程,发现还是存在一些问题。大体意思是说 Swift 的编译版本不再支持。所以我们需要选中 targets ,切换到 「Build Settings」 下面,搜索 「Swift Language Version」,在后面勾选合适的 Swift 版本。在这里我选择了 Swift 5 ## 手淘 App 落地 Swift,推进生态 经过技术调研、基础设施建设、工具链升级、里程碑业务上线和社区培训,得出“拥有一把锤子可以敲一个钉子,拥有一个工具箱可以造一艘航母”。 首先是业务视角: - 在业务需要快速迭代的时候,现有的 iOS 工程师主要以 Objective-C 为主,转战 Swift 需要一定的学习曲线,而且采用 Swift 效率是否一定有提高也有待考证; - Swift 只能解决 iOS 侧 Native 研发问题,对于高迭代效率的跨平台技术,收益不足。 其次是技术视角: - Swift 早期由于 ABI 不稳定,只能将 Runtime 内置在 IPA 包里面,占用约 3M 的下载空间,苹果还有 150M 的蜂窝网络下载大小的限制,且对启动性能有 150ms 的影响,在各家公司拼体验的时代,这些都会对公司的业务造成负担和损耗; - 由于语法不固定,每次升级都会造成源码级别的 Break Change,对开发者也会造成负担。淘宝、美团等巨型 App 都采用了二进制组建化研发模块,Swift 只能固定开发工具版本,对大型团队是一种负担和制约,反而极大的降低了研发效率。 未来一两年内国内 Swift 生态还是会有巨大改善的,主要有以下几个方面: - iOS 12.2 以上内置 Swift Runtime, 包大小随着存量旧版本操作系统升级后得到缓解; - iOS 12.2 以上也没有启动性能的影响; - Swift 语法不再大变,不会对开发者造成负担; - 苹果继续强势推进,Swift 社区热度持续提升。 相信生产力大幅提高后,没有人会放任好用的工具不用而去用一把快要锈掉的锤子(Objective-C )。