Yammer iOS 版移植到 Swift3

本文讲的是Yammer iOS 版移植到 Swift3,


随着九月下旬 Xocde 8 的发布,Swift 3 已经成为了开发 iOS 和 Mac OS 应用的默认版本。

作为一个 iOS 商店,我们必须制定一个迁移工程,在保持与项目中 Objective-C 部分良好交互的前提下,把基础代码从 2.3 版本迁移到 3.0 版本。

第一步是决定我们是否要移植到 Swift 3 。在之前我们没有别的选择,只能咬着牙上。但是这次 Xcode 8 提供了一个 build flag能够让你使用旧版本的 Swift 。这表明旧特性只对版本改变有意义。根据 发行说明 Xcode 8.2 预计是最后一个能够支持 Swift 2.3 的版本。

另一个让我们考虑反对迁移的原因是大量的 改变 。Swift 团队和社区非常的活跃,而且 Swift 3 也展示出了作为一个年轻语言的发展潜力。不幸的是,这个版本 不具有 ABI 的兼容性 ,意味着1年之后 Swift 4 着陆的时候,我们又要进行一次类似的迁移。现在不迁移的话,因为要同时迁移 3 和 4 的特性,到时候就是两倍的工作量了。当然不一定是真的,也许 Swift 4 的改变和 Swift 3 在相同的范围内呢,而且久而久之,Xcode 提供的迁移工具也会变得更加好用更加值得信赖。

不管怎么样,不出意料地,我们选择了迁移。

一旦我们决定开始迁移了,必须制定一个计划。把迁移工作模块化很明显是几乎不可能的。Xcode 只能允许编译一个 Swift 的版本,因此一旦迁移之球开始滚动,所有的改动需要同时合并到主干上。这就导致了一系列的逻辑问题:从禁止团队修改任何 Swift 文件,到后来出现大量 pull request 。同事也许会很感谢你的努力但是他们无论如何都会恨你的。我们最终决定建立一个笔记,团队中的任何人可以都把他们正在工作的类文件添加进去,通过这样我们就可以暂时把这些文件放在一旁,等到迁移之前再尝试将它们合并。这个工作一般来说不会轻松,尤其是你接下来的工作都要靠编译错误来指引的情况下。

也就是说,还是有更好的方法的。在 Target 中移除大部分你的类,然后 将它们构建成单独的模块 。这个方式可以使不同版本的 Swift 共存。但是,我不相信这是一个完全不痛苦的过程。我也不是真的知道,因为我们没有选择这个方式。

一旦准备好了,我们启动了 Xcode 的迁移工具(Edit->Convert->to Current Swift Syntax)然后看到生成了大量的不同点。我们通过分析每个文件中的每个不同点,对那些看上去不是很正确的进行笔记和制定草稿(在后面的列表中更多)。

和预想中的一样,在将项目迁移并能够成功编译的路上,迁移工具只能帮你做一半左右的工作。下一步是打开问题导航栏一个个的去解决警告和错误(是的,包括警告因为我们不是动物)。大部分的问题都会有个方便的解决提示,一般情况下它都是正确的解决方案,有时候最好重排或者重写代码,这样能够显得更清晰。迁移是一个重新审视和定义整个代码库中的某些实现的绝佳机会,特别是当这门语言才刚刚出现在大众视野中的时候。

在你进行的过程中,错误列表会不断的上下波动。通过全局的搜索替换可以很容易的找到能够区块修复的地方。最后代码终于可以编译和运行了,测试用例也终于能够编译,运行和通过了。能够通过测试用例是最第一个重要的里程碑了。目前为止的每个改动都应该尽可能的小。记下那些看上去奇怪的地方,在所有测试用例没通过之前都不要去动它们。

随着测试用例的通过,我们现在可以把注意力集中在已经收集的那些任务和笔记列表上了。这些代码都是正确可运行的,但却非常辣眼睛。(不要打开右侧的责任面版,说不定这个代码就是你自己写的!)

下面,是我们在迁移工程中记录的东西,有些每个人可能都会遇到,另外一些可能只在我们的代码库中间出现。

  • fileprivate 转成 private。这个迁移要把你所有的 private 声明改成 fileprivate 。这个不是必须要更正的因为有些确实是私有的。我们把所有 fileprivate 替换回了 private ,然后重新过了一遍错误,打开源码片段来检查哪些是真正需要的。
  • NSIndexPath 转成 IndexPath。有些改了但是有些没有,自己去探索吧!另一方面有些是需要改变的是我们的内部 api 。
  • UIControlState().normal 转成 UIControlState()。这个可选的默认值配置在 init 构造函数里面可以是空的。没有.normal 看上去生动,所以我们所有都替换了。例外一个值得注意的是 UIViewAnimationOptions() 我们替换成了.curveEaseInOut 。
  • Enum 中的枚举转成小写。有些枚举变成了首字母小写,有些不会。所以,我们手动做了这部分改动。这个迁移工具会把那些有敏感词冲突的单词,比如 default 通过使用逆向大小写来处理。
  • 你真的是可选的? 有些 API 改变了,采用了可选类型。如果这个一个内部的 Objective-C API 的话,确保你的可空标识是被正确设置了。
  • Objective-C 可空标识符。在 Swift 3 中,每个导入的没有可空标识符的 Objective-C 类都会被强制解包到可选。 最快的解决方法是每个地方都用 if let 或者 gurad let,但是在这么做之前,在 Objective-C 这边做个检查。
  • Optional 可比性。因为一些 API 中的可选性的改变,并且事实上也有许多 Objective-C 的 API 的改变(见上面),迁移工具会为泛型的可选类型生成一些比较函数( func < (lhs: T?, rhs: T?) -> Bool ),这是一个坏的点子,很可能你的逻辑需要改变,一些代码也要删除。
  • NSNumber!。Swift 3 不再会自动桥接 number 到 NSNumber 了(或者相似的其他 NS 类),但是在大部分的例子中,这个是不需要强制的。把它们都检查一遍。
  • DispatchQueue。我喜欢这个新的 DispatchQueue 语法,但是迁移工具把一些转换搞混了。并且代码中的每一个dispatchAfter 必须检查一遍方式重复转换到纳秒。因为大部分的 API 会用秒级的延迟,我们通过 NSEC_PER_SEC 来执行乘法加倍的操作,而迁移工具会使用这个逻辑并且通过 NSEC_PER_SEC 来分割,这种解决方法不够漂亮。
  • NSNotification.Name。现在 NotificationCenter 不再通过 String 而是 NSNotification.Name 来添加 observer 。迁移工具会把原来的量常量包装在一个 Notification.name 中,然而我们更倾向于把 Notification.name 赋给一个 let 变量来隐藏常量的逻辑。
  • NSRange 转变 Range.大部分的字符串 API 现在使用 Range 来替换 NSRange 。现在通过使用 literal ranges (0..<9) 更加容易操作它们。总的来说,ranges 在 Swift 中改变了很多,每个人在使用它的时候都崩溃过。重新检查一下它们,你的代码库值得这个变换!
  • _ 第一个参数。Swift 3 命名规范改变来暗指着函数的第一个参数,大部分你的 api 和 api 调用都会自动改变,有些则不会。更糟糕的是,有些建议的 api 改动导致你的函数变得难以阅读。想用 NS_SWIFT_NAME 作为那些 Objective-C 的名字是不够 Swift 化的。
  • Objective-C 类属性。许多类的调用在 Swift 中现在通过类属性的方式来实现之前的类方法(除了: _ UIColor.red)。在你的 Objective-C 中 你可以把一个 get 方法转换为一个 静态属性 ,它会在两个环境下生效。
  • Any 和 AnyObject。Objective-C 中的 id 类型现在不再由 Anyobject 而是由 Any 来代替了。这个转换相当容易地就能解决但是也可能导致一些行的误导, 阅读 和理解它们的不同之处。
  • 权限控制。我们已经讨论过 private 和 filePrivate 了。同样值得去重新检查一下 open, public 和 internal 。这是另外一个要在团队内部要达成一致协议的重要事情。

结论

迁移约 180 个 Swift 文件的过程花了两个人两周的时间。我们选择结对迁移(我这么称呼它!)是因为这样的条件下有特别的好处。 当这个项目的重点少部分在代码逻辑,而更多的在确保没有由于打字错误,重命名操作符和重排导致的新的bug时,有四只眼睛而不是两只眼睛就显得重要的多了。当你眼前的东西逻辑不通或是意义不明时,多一双手和一台笔记本来检查原始的代码会变得非常方便。总的来说,这样能让一个本来没什么乐趣的任务变得令人享受。不过当所有事情都失败的时候,至少你还能切换回去。感谢 Mannie(@mannietags) 的陪伴和忍耐。

由于工作流的本质是编译错误主导的,有时候想要将特定的操作合成连续的提交是很困难的。为了这个目标,回滚分支并且重新提交每一个逻辑模块,这样做至少可以让你的操作历史变得更好。这个可以延伸到来构建一个瀑布分支来创造小的 PR 。它们很明显稍后必须被合并到小瀑布中,或者你可以一开始就做好这部分工作。

迁移对把你的代码提高到更高的水平来说是个有效的方法。它通过更新代码版本来实现这一目的,同时这也是一次发现代码中不规范或过时编码的一个好机会。把这些发现和更新记录下来并加入你们的团队编码规范之中(如果你还没有这个规范,现在就开始写吧)。这么做主要有两个原因,其一是可以供将来加入团队的人进行参考。二来是可以将更新/创造过程中的思路展示出来。就像一个普通的迁移 PR 或许非常无趣,没有什么吸引力,而一个有着许多更新、同时还有描述这些变化的动机的说明的 PR,对团队中的其它成员就更容易跟进和理解了.






原文发布时间为:2016年12月08日


本文来自合作伙伴掘金,了解相关信息可以关注掘金网站。

时间: 2024-10-29 16:55:27

Yammer iOS 版移植到 Swift3的相关文章

微软概述“Islandwood”计划 - 将iOS应用移植到Windows

上个月,微软更新其Windows Bridge iOS版,它是一个开源工具来帮助开发者将iOS应用移植到Windows平台.更新版本添加了诸多新功能,并且集成了CoreFoundation.现在,该公司已概述了它希望如何改善这个开发工具. 微软表示,开发者一直要求微软对UIKit的执行可以完整覆盖API.但是,完全修改UIKit非常困难并且不可行,特别是考虑到Windows已经通过XAML提供相同的功能.但是,微软意识到这个问题,并已决定制定一个明确的方法,将基于UIKit的UI移植到XAML,

iOS版PSP模拟器PPSSPP怎么用

  很多童鞋喜欢玩PSP上面的游戏,那么一定需要PSP设备吗?现在有一款很火的psp模拟器ppsSPP,不仅可以在电脑上,还可以在安卓手机苹果手机上面使用.iOS版的PPSSPP的可玩性也达到了一个不错的水平,那它的实际表现又是怎样呢? 首先介绍一下iOS版的PPSSPP的安装方法,安装的前提当然是需要一台越狱后的iOS设备.   或者在Cydia中添加源:http://cydia.angelxwind.net/如图中红框所示   搜索PPSSPP并安装   因为iOS设备不能像Android一

iPhone5连接iPad iOS版WPS Office 共享播放初体验

在WPS Office移动版用户长久的期待中,我们终于迎来了iOS版WPS Office.产品在App Store上架不久就收获大量用户下载,并在当日即获得中国区商业类软件排行榜免费APP第一名的成绩.从此,苹果用户播放PPT文档又多了一个免费好工具:WPS演示. WPS 演示是iOS版本WPS Office的产品首发名称,在PPT文档格式兼容.动画播放效果和移动办公方面都将带来更好的PPT播放体验.Android版本WPS Office上久负盛名的共享播放功能也首发出现在此次的iOS版本中.近

iOS版WPS Office首次更新 新增PDF阅读等多项功能

近日,iOS版WPS Office 1.1.1正式上架AppStore,这是产品发布以来的首次重大更新.在文档管理和播放方面均有功能提升,用户使用将更加得心应手. 本次版本更新除了将进一步扩大对网盘种类的支持外,还将支持打开和查看PDF格式的文档,以及PPT文档中的GIF图片播放和超链接功能,总计10余处新增及改进特点,以下请看重要更新内容. 新增查看PDF文件 PDF是Adobe公司开发的一款便携文件格式,能够忠实再现原稿的每一个字符.颜色以及图象,更是保护文档最好的格式.因此,成为电子图书.

iOS 版WPS WiFi文件传输 三步将文件导入移动设备

手机.平板等移动设备成为人们生活中的必需品后,如何简便地将电脑与移动设备连通.实现文件共享成为迫切的问题.文件传输功能软件已经数不胜数,但是在苹果设备上快速完成这个操作,就要说一说iOS版WPS Office新推出的WiFi文件传输功能. iTunes传送文件,需要使用数据线将电脑与移动设备相连.使用网盘又需要登录才可以.通过WiFi文件传输,只需连接WiFi,将移动设备显示的网址在电脑上打开即可将电脑本地文件传输至移动设备上WPS Office的文件夹中.下面就来向大家详细介绍一下这个功能.

iOS版WPS Office 1.1.3发布 支持激光笔及SkyDrive

5月9日,iOS版WPS Office 1.1.3正式上架AppStore.此次更新继续完善演示文档的播放效果,以及新增对网盘的支持. 让人惊喜的是,1.1.3版本更加精细化文档播放,如演讲者视图模式.视频的播放,以及激光笔功能.此外还新增了iPad竖屏播放的支持,总计将近10处新增及改进特点,以下请看重要更新内容. iPad竖屏播放文档效果 新增支持激光笔标注 此次版本更新还带来了激光笔功能,让演讲者在平板电脑上更容易抓住用户的视角.更可使用激光笔做任何标注. 在共享播放模式下,进入激光笔模式

iOS 版WPS Office独家支持PPT播放动画声音和GIF

iOS版WPS Office版本升级,除了对更多全球主流网盘的支持外,进一步完善PPT演示文档的播放是这次更新的主要内容.据iOS版WPS Office开发负责人庄湧表示,iOS 版WPS Office领先同类移动Office软件推出了诸多创新功能,包括率先推出的PPT播放动画声音和GIF图片功能. iOS系统上可供用户选择的办公软件种类很多,功能丰富且免费的iOS版WPS Office一经推出即获得了用户的青睐.庄湧还透露,iOS版WPS Office用户数量一直呈几何增长趋势,最近下载量已经

iPad Mini体验iOS版WPS办公软件

随着移动互联业务的飞速发展,人们对于移动办公的渴求也进一步上升.面对日益普及的移动办公趋势,笔者也在近日入手了iPad,配合iOS版WPS Office软件,可实现随时随地播放PPT文档.阅读PDF资料等,并可将文档共享给工作伙伴,带来了优越的办公体验. 下面,就跟随笔者一起去体验iOS版WPS Office带来的移动办公乐趣吧! 支持全部动画及声音 在WPS Office中打开PPT文档后,屏幕左边显示了PPT中的每张幻灯片,右边则是当前页面的显示内容,通过上下滑动屏幕可以页面内容.如果单击界

iOS版WPS WiFi文件传输功能快速导入文件

  手机.平板等移动设备成为人们生活中的必需品后,如何简便地将电脑与移动设备连通.实现文件共享成为迫切的问题.文件传输功能软件已经数不胜数,但是在苹果设备上快速完成这个操作,就要说一说iOS版WPS Office新推出的WiFi文件传输功能. iTunes传送文件,需要使用数据线将电脑与移动设备相连.使用网盘又需要登录才可以.通过WiFi文件传输,只需连接WiFi,将移动设备显示的网址在电脑上打开即可将电脑本地文件传输至移动设备上WPS Office的文件夹中.下面就来向大家详细介绍一下这个功能