Swift 4迁移总结:喜忧参半,新的起点

这次Swift 3 到 4 的迁移代码要改动的地方比较少,花了一个下午的时间就完成了迁移。Swift 把原来 4.0 的目标从 ABI 稳定改为了源码兼容,此次代码的兼容性做的确实很好,这个目标算是达到了。然而对于一个成熟的项目而言,单纯语法上的兼容并不是全部,这次的升级也带来了一些新的变化。

3.2 和 4.0

在 3.0 的时候 swift 也提供了 2.3 和 3.0 两个版本,这次 4.0 也是提供了 3.2 版本。从我项目里的代码来看,从 3.0 到 3.2 要做的改动几乎没有,只是需要重新编译一次。社区的反应来看兼容 3.2 也没反馈出什么大的改动。所以对于推迟跟进 4.0 的团队来言会是一个很顺滑的过度,可以安心的切换到 Xcode 9。

为了让大家在迁移过程中更加顺利,swift 的 framework 支持 3.2 和 4.0 版本混编。如果你有好几个组件,可以单独为某个组件升级到 4.0 。这样大的团队可以不用一口气所有的代码都迁移到 4.0。
然而 3.2 和 4.0 的兼容并没有看上去那么美好。


首先是cocoapods的问题,反正在目前pods的framework只能指定一个版本的swift。issue在这里:Pods automatically compiling with Swift 4.0 in Xcode 9 beta 1 。pod默认会使用一个swift版本编译全部,需要对不同的库单独指定swift版本。

遇到这个问题后,我把所有组件都迁移到了 4.0 ,app 因为有很多业务代码,希望先迁到 3.2 ,这样可以尽早支持 Xcode 9,同事可以尽早适配 iOS 11。然而。。。


Xcode 果然没让我失望啊,编译的时候没有错误提示只告诉你失败了:


compiling as Swift 3.2, with 'xxx' build as Swift 4.0(this is supported but may expose additional compiler issues)

提示也很清奇,我翻译一下:我们虽然支持混编,但是也可能混出毛病,所以你还是别混了。不过听闻丁香园的项目目前是主 app 4.0,组件 3.2 混编是成功的。所以说呢,如果要混可以碰碰运气。

顺便说下Xcode 9新的编译系统,我这里根本编译不过(可能因为我们混OC?),而且没有任何错误提示。苹果的软件质量果然是独领风骚,面向运气编程。

社区跟进及时

所以实际上,你要不然就全不动,停在 3.2。一旦要迁移就需要全部迁移到 4.0 。

好在这次因为语法改动小,我用到的大部分 Swift 库都支持了 4.0。弃更的只有 DOFavoriteButton ,一个点赞的控件。跟进比较慢的有 RxGesture、EZSwiftExtensions,不过已经也有了 4.0 的分支,也有人提了 4.0 的 PR,估计过几天应该也能合进去。只能说维护的人不够积极。
下面把我用到的 pod 贴出来:

3.2 4.0
RxSwift/RxCocoa 4.0.0-beta.0
SnapKit 4.0.0
CryptoSwift 0.7.0 0.7.1
Alamofire 4.5.1 4.5.1兼容(5.0还未发布)
ObjectMapper 2.2.9 3.0
SwiftyAttributes 3.2.0 4.0.0
Kingfisher 4.1.0 4.0
MonkeyKing 1.4.0

通常情况下3.0是可以直接在3.2下编译的,所以“无”并不表示不能使用,指开发者没有单独声明一个版本兼容3.2。

4.0 开始与 OC 正式分道扬镳

为了照顾原有的开发者,Swift 2.0 的时候要做到的目标是与 OC 尽量兼容,除了几个基础的数据类型比如 Int、String 与OC不同外,其他的 API 都和 OC 保持一致,完全可以用 OC 的习惯写 Swift 。到 3.0 的时候Swift 体系开始独自进化,开始有自己的命名规范。

到 4.0 的时候,Xcode 用 Swift 重写了编译器,虽然 New build system 目前还在 preview,也确实有很多问题,然而针对 Swift 的编译优化又取得了不小的提升。我已经能感觉到苹果想要抛弃 OC 的意思,至少是非常明显的嫌弃的意思。

从代码层面来看,原先一个类只要是 NSObject 的子类,默认这个类的所有的属性方法都会自动添加给 OC 调用的 bridge,在 4.0 里这个功能被关闭了。这也是迁移 4.0 的一个比较大的工作量(对于和 OC 混编的项目)。什么意思呢,以前我们用 Swift 自定义了一个控件,原先在 OC 中引入 module 的头文件后,可以调用到这个控件公开的所有属性、方法。但是迁移到 4.0 后,所有属性、方法默认都是不能访问到,需要到控件里给要暴露给 OC 使用的属性方法前加上 @objc 。

这个改动影响非常深远。这等于是让开发者二选一了。如果我们用 Swift 写一个组件,需要支持 OC 加上 @objc 标志,编译时就要生成给 OC 调用的声明,这降低了一些些性能。但是不加的话 OC 又调用不到。更深的原因是,在写组件的时候我们并不确切的知道业务方是用 OC 还是 Swift 调用的。除非业务代码全是 Swift。或者只能全盘做 OC 桥接,到处都是 @objc,如果上面调用的是 Swift,这些又白加了。

这里还出现了另外一个细节。如果我们在 OC 里给 UIView 声明了一个属性 size,在 Swift 里也声明了一个属性 size。如果是在一个 framework 里,会编译失败提示冲突了。然而如果这两个写在不同的 framework 里,Xcode 不会提示。在 8 的时候,这个 size 的调用最后会走到 OC 的方法,但是在 9 的时候,在 Swift 代码里引入这个 OC framework,代码就直接崩溃了,会不知道应该调用那个库的 size。这显然是编译器的一个 bug,但这也侧面反映了,OC 和 Swift 混编带来的问题越来越多,两个体系的区别会越来越大。

总结

迁移到 4.0 的代价比之前要小的多, ABI 稳定很大可能在 5.0 到来。对于观望 Swift 是否稳定的开发者而言是个好消息,相信 Swift 的接受程度会更高。Swift 一年一个版本的升级和 OC 的分野会越来越大,给混编带来了很多的不确定性,对于混编的项目有能力的还是把一些代码迁移到 Swift。

对于 Xcode 我有一个经验再次和大家分享一下:Xcode 有两个版本,一个不稳定的版本和一个更不稳定的版本。

欢迎在社交网络上关注我:

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

推荐阅读更多精彩内容

  • 这段日子,于我而言并非是个惬意非常的阶段,有很多的大事件,又有不少小插曲,让我的日常生活也是一波三折,有期待...
    吃面包的泡芙小姐阅读 219评论 0 0
  • 最开始说把南大宝送进托幼机构的是爷爷,不是家里没人带孩子,纯粹是为了培养他良好的生活习惯。大宝自出生后,大部分时间...
    南宝宝妈阅读 349评论 0 0