Swift 3 迁移工作总结

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看161 回复回复1 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 161|回复: 1
收起左侧

Swift 3 迁移工作总结

[复制链接]
移动 发表于 2016-10-30 07:10:07 | 显示全部楼层 |阅读模式
快来登录
获取最新的苹果动态资讯
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
本帖最后由 移动 于 2016-10-30 13:22 编辑

0、写在前面

Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0。所以写点小总结。在升级之前,我先到全球最大的Swift开发者社区敏捷大拇指Swifthumb.com)上看了下资料《Xcode 8 & Swift 3.0 迁移适配实战经验总结,含第三方库》、《如何向Swift 3.0进行数据迁移升级?Migrating Advice, tips,and warnings》,迁移起来心里有底多了。

Swift 3 迁移工作总结

Swift 3 迁移工作总结 - 敏捷大拇指 - Swift 3 迁移工作总结





1、背景



1.1、代码量(4万行)

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



1.2、迁移时间(一天左右)

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




2、准备

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



2.1、界面用 xib 而不用纯代码

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



2.2、关于第三方库的选择:

对于一个项目来说,三方库似乎成了一道必选菜,但是如何去选择这道菜呢?

对于三方库,当初的选择是,能用 OC 就尽量用 OC。 毕竟可以OC 可以无缝衔接到 Swift,而且还相对稳定。

在选择 Swift 相关的三方库时,我尽量值选择使用者比较多的库,例如Alamofire、Snap、Kingfisher、Fabric 等,因为使用者比较多,开发者会更愿意去维护,而不至于跳票。所以不会存在现在许多小伙伴面临的问题,想迁移,但是有些库没有更新。至少对于我来说,当我想迁移的时候,所有和 Swift 相关的三方库都已经迁移到了 3.0 了。


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



2.3、知识储备升级

先了解了一下Swift 2 到 Swift 3 的变动,及变动的原因。(看完心中一万头草泥马飞过,但是其实是越来越好了)



然后把语法文档快速的重温了一遍。






3、迁移中的问题


3.1、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] 纯文本查看 复制代码
// Swift 2
 var json = [String:AnyObect]()
json["key1"] = 1 
json["key2"] = "2" 

// to Swift 3 Step 1
 var json = [String:AnyObect]()
json["key1"] = 1 as AnyObject?
json["key2"] = "2" as AnyObject?

// to Swift 3 Step 2
 var json = [String:Any]()
json["key1"] = 1 
json["key2"] = "2"

// Swift 2 
public typealias JSONDictionary = [String: AnyObject]
// To Swift 3 Step 2
public typealias JSONDictionary = [String: Any]




3.2、Alamofire 等三方库支持 iOS 8

虽然说我使用的三方库都在第一时间将库升级到了 Swift 3 ,但是期中 Alamofire 和 Snap 两个库最低适配只支持到了 iOS 9,为了避免和产品撕逼,不得不想办法解决这个适配问题。下面以 Alamofire 为例。

其实三方库么,不一定只用 Cocoapods 的。所以打算下载代码然后直接撸源码。

先Alamofire的 Xcode 修改为最低适配 8.0,然后编译查找不通过的函数,并删除。(其实这些函数都是 iOS 9 新加的函数,所以删除不影响什么。)

大概花了 半个小时左右就可以删完了,然后直接拖到项目中就可以了~

Snap 其实只要拖进去就好了,暂时不需要修改什么。

[Swift] 纯文本查看 复制代码
// 其实都是 !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




3.3、@escaping

这个是我在适配中最蛋疼的坑。

首先在看swift-evolution只是了解到@escaping 必须显示声明。但是不知道@escaping的闭包,在函数体内无法再修改。

[Swift] 纯文本查看 复制代码
    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)

    }




3.4、Result of call to 'funtion' is unused

这其实不是一个 编译错误,但是这个警告最开始让我有点懵逼.返回值不用难道要我都修改一下?

最开始其实我是这么修改的 let _ = funtion(),但是后面在看SE-0047的时候发现@discardableResult也是可以达到这个效果的。



3.5、Date && NSDate

因为有个项目中使用的 DateTools 这个工具。它有一个 NSDate + Tools 的分类。

但是在写 Swift 3 的过程中我发现如果变量是 Date 类型的无法使用NSDate + Tools 这个类型,必须显示声明 date as NSDate 这样才能调用分类的一些个方法。

这个让使用 OC 的库的时候会感觉十分不舒服,毕竟很多 NS 的前缀去掉了。所有都显示声明太不友好了。



3.6、CAAnimationDelegate

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

[Swift] 纯文本查看 复制代码
@interface NSObject (CAAnimationDelegate)

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

@end


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

[Swift] 纯文本查看 复制代码
@protocol CAAnimationDelegate <NSObject>
@optional

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

@end


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




4、其他

还有许多微妙的变化让你似乎看不懂这个语言了,所以建议在适配之前看一下下面的文章。



还有几个不错的总结:

Swift 3 by 顾 鹏
适配 Swift 3 的一点小经验和坑 by 图拉鼎




5、总结

总的说来这次迁移没有想象中的那么痛苦,虽然提案的改动很大,但是得益于 Xcode 8 的迁移工具,这次迁移花费时间不多,当然也有可能和我的代码量有关系~

在迁移完之后,再看代码,会发现 Swift 更加的优雅了,至少相比于 2 来说好了很多,至于好在哪里?你自己写写不就知道了咯。

最后,终于可以把 Xocde 7 卸载,再也不用担心两个一起开无脑闪退了!!!

最后对于明年的 Swift 4 只想说 快来吧~分分钟把你解决!详见敏捷大拇指上的文章《Swift 4路线图 The Roadmap to Swift 4

其实适配之路才刚刚开始,因为 Xcode 8 自动转的代码并没有很好的 Swift 3 化。目前只是说在 Swift 3 可以编译通过了而已~




6、更多

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




作者:Damonwong


都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

本帖被以下淘专辑推荐:

数学家 发表于 2016-11-2 13:11:51 | 显示全部楼层
要是苹果能做到自动升级Swift代码,那就好了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表