Swift 3 迁移工作总结

来源:Damonwong(@王浙剑)

链接:http://www.jianshu.com/p/f4761952b8c2

写在前面

  • Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0。所以写点小总结。

背景

代码量(4万行)

  • 首先,我是今年年初才开始入手 Swift 的。加上 Swift 的 ABI 和 API 一直不稳定,所以没有在项目中大范围的使用,所以这次迁移的代码量不多,大概在4万行左右。

迁移时间(一天左右)

  • 迁移时间上的话,大概是花了1天左右。两个混编项目,一个 Swift 为主的项目。期中 Swift 为主的项目 花了大概大半天时间,两个混编代码量差不多,但是一个花了小半天,还有一个差不多只花了半个小时(原因先留个悬念~)。

准备

在开发最初开发选择 Swift 的时候的很多决策也让我这次少了很多工作量。

界面用 xib 而不用纯代码

  • 阴差阳错的,和 Swift 相关的大部分界面都是用xib 画的。而这个 xib 在这次迁移中得到了很大的优势,xib 和 SB 的代码不适配 Swift 3。想当初要是使用代码写的 UI 的话,这次迁移改动估计会多很多吧。

关于第三方库的选择:

  • 对于一个项目来说,三方库似乎成了一道必选菜,但是如何去选择这道菜呢?
  • 对于三方库,当初的选择是,能用 OC 就尽量用 OC。 毕竟可以OC 可以无缝衔接到 Swift,而且还相对稳定。
  • 在选择 Swift 相关的三方库时,我尽量值选择使用者比较多的库,例如Alamofire、Snap、Kingfisher、Fabric 等,因为使用者比较多,开发者会更愿意去维护,而不至于跳票。所以不会存在现在许多小伙伴面临的问题,想迁移,但是有些库没有更新。至少对于我来说,当我想迁移的时候,所有和 Swift 相关的三方库都已经迁移到了 3.0 了。

得益于上面两点,在迁移过程中少了不少工作量。??

知识储备升级

  • 先了解了一下Swift 2 到 Swift 3 的变动,及变动的原因。(看完心中一万头草泥马飞过,但是其实是越来越好了)
    • Swift官博:https://swift.org/
    • swift-evolution:https://github.com/apple/swift-evolution/blob/master/releases/swift-3_0.md
    • Swift 3 新特性一览:https://realm.io/cn/news/appbuilders-daniel-steinberg-whats-new-swift-3/
  • 然后把语法文档快速的重温了一遍。
    • Swift Programming Language:https://developer.apple.com/swift/
    • 中文版:http://wiki.jikexueyuan.com/project/swift/

迁移中的问题

Any && AnyObject

  • 我想在做迁移和做完迁移的同学改的最多的一个就是 as AnyObjct? 吧?
  • 至少对于我来说是的。
  • 和这个相关的基本是集合类型。在 Swift 2 中我们一个用 [AnyObject] 来存放任何变量,甚至于存放struct类型的 String、Array 等。但是按道理 Swift 的 AnyObject 指的是类,而 Any 才是包括struct、class、func 等所有类型。但是为何 Struct 可以放入 [AnyObject] 呢?在 Swift 2 的时候会针对String、Int 等 Struct 进行一个 Implicit Bridging Conversions。而到了 Swift 3 则进行了一个**Fully eliminate implicit bridging conversions from Swift**改动。
  • 当然在我的项目中[AnyObject]其实是小事,最麻烦的就是 [String:AnyObject]。因为当初写项目的时候,还是处于 OC To Swift 的阶段所以对于 Dictionary ,基本采用了 [String:AnyObject], 所以在修改的时候,在很多地方为了这个修改。
    • 起初,我是照着 Xcode 的提示,在 Dictionary 后面的 value 后面加了一个 as AnyObjct?
    • 后来渐渐的发现我做了一件很傻比的事情,其实我只要把 [String:AnyObject] 改为 [String:Any] 就可以了。??
  • 这也就是为什么在第一混编的项目中我花了那么多时间去修改代码了!得益于混编的第二个项目学习了 Yep 的思路,是把 [String:AnyObject] 命名为一个叫做 JSONDictionary 的类型。所以在 Any && AnyObect 这个事情上,就花了一点点时间。

// Swift 2

var json = [<span class="hljs-link_label">String:AnyObect</span>]()

json["key1"] = 1

json["key2"] = "2"

// to Swift 3 Step 1

var json = [<span class="hljs-link_label">String:AnyObect</span>]()

json["key1"] = 1 as AnyObject?

json["key2"] = "2" as AnyObject?

// to Swift 3 Step 2

var json = [<span class="hljs-link_label">String:Any</span>]()

json["key1"] = 1

json["key2"] = "2"

// Swift 2

public typealias JSONDictionary = [String: AnyObject]

// To Swift 3 Step 2

public typealias JSONDictionary = [String: Any]

Alamofire 等三方库支持 iOS8

  • 虽然说我使用的三方库都在第一时间将库升级到了 Swift 3 ,但是期中 Alamofire 和 Snap 两个库最低适配只支持到了 iOS 9,为了避免和产品撕逼,不得不想办法解决这个适配问题。下面以 Alamofire 为例
  • 其实三方库么,不一定只用 Cocoapods 的。所以打算下载代码然后直接撸源码。
  • 先Alamofire的 Xcode 修改为最低适配 8.0,然后编译查找不通过的函数,并删除。(其实这些函数都是 iOS 9 新加的函数,所以删除不影响什么。)
  • 大概花了 半个小时左右就可以删完了,然后直接拖到项目中就可以了~
  • Snap 其实只要拖进去就好了,暂时不需要修改什么。

// 其实都是 !os(watchOS) 这个宏下面的

#if !os(watchOS)

@discardableResult

public func stream(withHostName hostName: String, port: Int) -> StreamRequest {

return SessionManager.default.stream(withHostName: hostName, port: port)

}

@discardableResult

public func stream(with netService: NetService) -> StreamRequest {

return SessionManager.default.stream(with: netService)

}

#endif

@escaping

  • 这个是我在适配中最蛋疼的坑
  • 首先在看swift-evolution只是了解到@escaping 必须显示声明。但是不知道@escaping的闭包,在函数体内无法再修改。

let pedonmeter:CMPedometer = CMPedometer()

func getPedometerDataFromDate(_ datet:Date?, withHandler handler: @escaping (CMPedometerData?, Error?) -> ()){

// 编译错误

pedonmeter.queryPedometerDataFromDate(startTime, toDate:endTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in

guard let pedometerData = pedometerData else { return }

handler(pedometerData, error)

// 做一些事情

})

// 最后逼不得已只能不修改了,函数外面就做一些事情了

pedonmeter.queryPedometerData(from: startTime, to: endTime, withHandler:  handler as! CMPedometerHandler)

}

Result of call to ‘funtion’ is unused

  • 这其实不是一个 编译错误,但是这个警告最开始让我有点懵逼.返回值不用难道要我都修改一下?
  • 最开始其实我是这么修改的 let _ = funtion(),但是后面在看SE-0047的时候发现@discardableResult也是可以达到这个效果的。

Date && NSDate

  • 因为有个项目中使用的 DateTools 这个工具。它有一个 NSDate + Tools 的分类。
  • 但是在写 Swift 3 的过程中我发现如果变量是 Date 类型的无法使用NSDate + Tools 这个类型,必须显示声明 date as NSDate 这样才能调用分类的一些个方法。
  • 这个让使用 OC 的库的时候会感觉十分不舒服,毕竟很多 NS 的前缀去掉了。所有都显示声明太不友好了。

CAAnimationDelegate

  • 这个其实好像是 Xcode 8 的修改。因为之前CAAnimationDelegate 是一个分类。大概声明如下:

@interface NSObject (CAAnimationDelegate)

- (void)animationDidStart:(CAAnimation *)anim;

-

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

@end

  • 之前是在 vc 中只要重写一下 animationDidStart 函数就可以了。但是新的不行,起初以为是 Swift 3 的变化,但是其实是 Xcode 8 中的修改。将 CAAnimationDelegate 变成了一个协议。我感觉这个修改是为了适配 Swift 3 ?变化如下:

@protocol CAAnimationDelegate <NSObject>

@optional

- (void)animationDidStart:(CAAnimation *)anim;

-

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

@end

因为宽度时间比较长,其他的暂时想不到了。未完待续吧…

其他

  • 还有许多微妙的变化让你似乎看不懂这个语言了,所以建议在适配之前看一下下面的文章。
    • Swift 3 新特性一览:https://realm.io/cn/news/appbuilders-daniel-steinberg-whats-new-swift-3/
    • [Swift 3.0 – Released on September 13, 2016]https://github.com/apple/swift-evolution/blob/master/releases/swift-3_0.md
    • 还有@卓同学 的 Swift 3 必看系列:http://www.jianshu.com/notebooks/6709594/latest
  • 还有几个不错的总结
    • Swift 3 by 顾 鹏:http://tech.glowing.com/cn/swift3/
    • 适配 Swift 3 的一点小经验和坑 by 图拉鼎:https://zhuanlan.zhihu.com/p/22584349

总结

  • 总的说来这次迁移没有想象中的那么痛苦,虽然提案的改动很大,但是得益于 Xcode 8 的迁移工具,这次迁移花费时间不多,当然也有可能和我的代码量有关系~
  • 在迁移完之后,再看代码,会发现 Swift 更加的优雅了,至少相比于 2 来说好了很多,至于好在哪里?你自己写写不就知道了咯。
  • 最后,终于可以把 Xocde 7 卸载,再也不用担心两个一起开无脑闪退了!!!
  • 最后对于明年的 Swift 4 只想说 快来吧~分分钟把你解决!
  • 其实适配之路才刚刚开始,因为 Xcode 8 自动转的代码并没有很好的 Swift 3 化。目前只是说在 Swift 3 可以编译通过了而已~

更多

工作之余,写了点笔记,如果需要可以在我的 GitHub 看。

https://github.com/Damonvvong/iOSDevNotes

时间: 2024-08-28 05:31:28

Swift 3 迁移工作总结的相关文章

数据迁移经验总结——亿级别多表异构的数据迁移工作

由于系统改版,最近三个月在做数据迁移工作,由于业务的特殊,基本将数据迁移所能踩的坑都踩了一遍,决定好好做个总结. 迁移类型--新老系统表结构变化较大的历史数据 一.核心问题 1.新老表结构变化极大.新表是以deliver为核心,另外还涉及仓储系统的一张表,订单系统的4张表,并按照新的逻辑映射关系进行迁移. 2.增量数据迁移.在全量数据迁移时必然会有新的数据,这些数据应该实时进行迁移 3.亿级别数据性能.效率的考虑.由于订单业务非常重要,数据迁移带来的qps对数据库的压力非常大,需要不断测试迭代找

Swift 3 迁移详解

写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0.所以写点小总结. 背景 代码量(4万行) 首先,我是今年年初才开始入手 Swift 的.加上 Swift 的 ABI 和 API 一直不稳定,所以没有在项目中大范围的使用,所以这次迁移的代码量不多,大概在4万行左右. 迁移时间(一天左右) 迁移时间上的话,大概是花了1天左右.两个混编项目,一个 Swift 为主的项目.期中 Swift 为主的项目 花了大概大半天时间,两个

MySQL 数据库迁移工作小记----连接抓取、展示与异常连接

背景:由于公司机房网络调整,需要调整一批mysql 数据库的服务器IP,在新环境中已经搭建好新架构(keepalive+lvs),并需要开发工程师配合修改程序配置,共有2个业务,9台服务器,50多个实例. 1.抓取连接脚本 ---从繁重的重复工作中解脱出来 为了使切换的过程更高效并解放自己的双手,编写了简单的shell脚本,定时抓取连接并存储至核心数据库,简单的例子: #!/bin/bash                                                     

数据迁移工作总结

这两天,公司项目excel数据功能扩展,需要对历史数据进行数据迁移. 公司最近几次重大功能的上线,都设计到数据迁移问题.可以说数据迁移是产品上线之前,重要的一个环节.数据迁移一般设计的问题较多,不单单是数据位置的变动,更多的是数据格式要变化. 这两天我的任务就是根据原有的四个数据库表合成新的三张数据库表,同时将历史的excel数据格式进行转换,存储的MongoDB中.这数据迁移的过程中,还是有很多问题需要注意的. 首先,就是数据迁移时间问题.数据迁移尽量要在短时内搞定,因为只有在短时间内搞定,保

开平区的数据迁移工作

select * from t_cmts_disk ; -- 备课资源 (复制资源目录) select path_content from t_cmts_disk where mediatype_id='002' and stage_id=? and subject_id=? -- ; path_id:0000 -- 旧资源 select stage_id,stage_name from t_stype_stage; -- 学段 select stage_id,stage_name from d

将 Objective-C 代码迁移到 Swift(Swift 2.0更新)-b

本节内容包括: 为你的Objective-c代码做好迁移准备 (Preparing Your Objective-C Code for Migration) 迁移过程(The Migration Process) 问题解决提示(Troubleshooting Tips and Reminders) 迁移工作提供了一个重新审视现有 Objective-C 应用程序的机会,并通过 替换部分Swift 代码来更好的优化应用程序的架构,逻辑以及性能.换句话说,所谓增量app迁移,就是让你使用之前的工具-

Swift 3 中的新特性

原文:What's New in Swift 3? 作者:Ben Morrow 译者:kmyhy Swift 3 将在下半年退出,对于 Swift 程序员来说,它带来了许多改变. 如果你没有密切关注 Swift Evolution 项目,那么在将代码迁移到 Swift 3 时,你可能不知道它到底有什么改变,以及它会对你的代码带来什么影响.那么你可能需要读一下这篇文章了. 通过本文,我将重点介绍 Swift 3 中的重大改变,这些改变对你的代码有深刻影响.让我们开始吧! 开始 目前,Swift 3

Swift 3 新特性

原文:What's New in Swift 3? ,作者:Ben Morrow,译者:kmyhy Swift 3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变.如果你没有关注过 Swift Evolution 项目,你可能会好奇Swift 3中有什么改变,它会对你的代码带来什么影响,以及何时可以将代码移植到Swift 3.本文就将为你答疑解惑! 本文中,我将重点介绍 Swift 3 中的重大改变,以及这些改变对你的代码的深刻影响.让我们开始吧! 开始 目前,Swift 3 预

vmware P2V迁移同步实践

                         作者 :杨 坚 第一部分:P2V迁移 P2V迁移需要使用VMware vCenter Converter Standalone 5.0 ,该软件提供了一种易于使用的解决方案,可以从物理机(运行 Windows 和 Linux).其他虚拟机格式及第三方映像格式自动创建 VMware 虚拟机.通过简单易用的向导驱动界面和集中管理控制台,Converter Standalone 无需任何中断或停机便可快速而可靠地转换多台本地物理机和远程物理机.通过在数