Swift 3 迁移工作总结

写在前面

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

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

知识储备升级

迁移中的问题

Any && AnyObject

  • 我想在做迁移和做完迁移的同学改的最多的一个就是 as AnyObjct? 吧?
  • 至少对于我来说是的。
  • 和这个相关的基本是集合类型。在 Swift 2 中我们一个用 [AnyObject] 来存放任何变量,甚至于存放struct类型的 StringArray 等。但是按道理 Swift 的 AnyObject 指的是类,而 Any 才是包括structclassfunc 等所有类型。但是为何 Struct 可以放入 [AnyObject] 呢?在 Swift 2 的时候会针对StringIntStruct 进行一个 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 = [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]

Alamofire 等三方库支持 iOS8

  • 虽然说我使用的三方库都在第一时间将库升级到了 Swift 3 ,但是期中 AlamofireSnap 两个库最低适配只支持到了 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

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

其他

总结

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

更多

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,551评论 4 58
  • 璞玉离刀斧 玄铁自埋尘 但求知音少 曳尾深涂中
    梁世星阅读 161评论 0 0
  • form 标签 表单(重要) 基本使用 (action,method,enctype)要提交的表单必须放到...
    Demoer阅读 276评论 0 0
  • 从记事起,我的童年就是灰暗的,是嘈杂的。没有朋友,没有玩具,没有欢笑。 我童年的记忆只有爸爸抽不完的烟,喝不完的酒...
    刘阿文阅读 689评论 3 2
  • 一个温暖的港湾不大不小,刚刚能容纳那小船儿也不必多么现代,不用怎样繁华只要它静静地在那儿 不管小船儿什么时候抵达不...
    GavinErnest阅读 290评论 0 0