设为首页 加入收藏

TOP

Swift 3 新特性和迁移详解(一)
2017-10-10 12:14:06 】 浏览:8619
Tags:Swift 特性 迁移 详解

写在前面

  • 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 的时候会针对StringInt 等 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 = [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 ,但是期中 Alamofire 和 Snap 两个库最低适配只支持到了 iOS 9,为了避免和产品撕逼,不得不想办法解决这个适配问题。下面以 Alamofire  为例

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

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

  • 大概花了 半个小时

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇# iOS 10 适配 # 适配刷新控件 以.. 下一篇Swift泛型协议的N种用法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目