Swift 2021 生态调研报告

3,228 阅读17分钟

回顾 2020

在去年的《一次关于 Swift 在 iOS 生态圈里的现状调研》一文中, 我们分析了整个大环境的现状,在文章发表后得到了大家的广泛关注,时隔一年,我们再来看看有什么变化吧?

Swift 语言

版本变化

首先从去年的 5.2 版本,到现在即将发布 5.4 版本,Swift 经历了 2 个小的版本变化,分别是 5.3 和 5.4

其中 5.3 版本给出了以下几个语言特性:

  • SE-0276[1]:catch 语句在捕获 error 的时候,可以更加灵活自由,例如一次捕获多个 error 或者对 error 的值进行绑定。

  • SE-0279[2]:支持多个尾随闭包,这个特性主要是为 SwiftUI 准备的。

  • SE-0266[3]:enum 支持 comparable 协议,并根据顺序自行决定大小

  • SE-0269[4]:在某些场景下可以避免 self 关键字的声明

  • SE-0281[5]:通过 @main 关键字定位程序入口

  • SE-0267[6]:在函数的泛型和扩展中就可以使用包含 where 关键字的语句

  • SE-0280[7]:protocol witness 匹配模型在枚举值中的加强

  • SE-0277[8]:新增 Float16 的数据类型

  • SE-0268[9]:didSet 方法优化和语义更新

  • 首先在 SE-0271[10] 中,Swift Package Manager 在资源文件的支持上有了进一步的提升,同时,在 SE-0278[11] 中,SPM 对本地化资源的支持也有了改进,而且在 SE-0272[12] 中,SPM 终于支持了二进制形式的组件。在 SE-0273[13],SPM 允许我们对特定的 target 进行特殊的依赖配置。

其中在未来的 5.4 版本又新增了以下几个语言特性: 

  • SE-0287[14]:提升了隐式成员表达式的类型推断能力。 

  • SE-0284[15]:在函数中可以定义多个可变参数。 

  • SE-0289[16]:在 5.1 就公布的 Function Builder 功能正式命名为 Result Builder,并在原先的基础上进行了完善。 

  • SR-10069[17]:嵌套函数支持重载 SE-0294[18]:新增 executable 类型的 target,使得 SE-0281[19] 新增的特性更

  • 易于使用。 property wrapper 除了可以作为属性外,还可以在函数里作为本地变量。

On the road to Swift 6

在 2021 年的 1 月,Swift 社区的 Ted Kremenek[20],他的另一个身份是 Manager of the Languages and Runtime Team @Apple,在 swift.org forum[21] 公布了一则名为《On the road to Swift 6》[22]的文章  

在这篇文章里,提到了一些对 Swift 6 的规划,从大方向来说,Ted 提了三点:  

  1. 加速整个 Swift 软件生态的发展:包含兼容更多的开发平台,简化软件的安装部署和大力发展各类工具库。  

  2. 打造极致的开发体验:包括更快的构建速度,更好用的调试工具,更灵敏的代码补全和更丰富的诊断信息。 

  3. 结合开发者的反馈进一步发展语言特性:包括完善 API 的设计,拓展其在底层系统,服务器和机器学习方面的应用场景,同时对某些主流的语言特性提供支持,例如并发特性和内存相关的特性。 

同时 Swift 的核心团队也发生了一些变化,Saleem Abdulrasool[23] 和 Tom Doron[24] 作为新成员加入到核心团队,而 [Dave Abrahams] 则退出了核心团队。 

 这里稍微提一下的,Tom 是 SwiftNIO 的核心开发,同时在 SSWG(Swift Server Work Group) 项目中也是主要的发起者,而 Saleem 是 Swift to Windows 的核心发起者,这两个变动结合着最开始的三个大方向,可以看出整个核心团队是言行一致的。 

另外关于 Swift 6 的公布时间,Ted 的原话是这样的:

Instead of announcing a specific timeline for “Swift 6”, the plan is for the community to be a part of seeing these efforts progress, with focused efforts and goals, and we release Swift 6 when those efforts culminate. 

所以这样看来,Swift 6 还是有一段时间才能与我们见面,毕竟人家说了 when those efforts culminate!

那反过来看,Swift 5 还将会是近期使用的主要版本。(PS:希望今年的 WWDC 21 不要被打脸)

技术社区

语言排行榜

同样我们来看一看编程语言排行榜 TIOBE[25] 和 PYPL[26] 的情况,在 TIOBE 的排行榜中,Swift 在今年的排名是第 15 名,而 Objective-C 已经彻底排在了 20 名之外了。

而在 PYPL 的排行榜中,Swift 和 Objective-C 的热度还是较为接近的。

从社区的语言排行榜来看,虽然乍一看,感觉还是 Swift 和 Objective-C 共存的大环境,但其实背后也反映出,Swift 已经被大部分开发者所接受了。

社区活跃度

同样通过 GitHut 2.0[27] 这个工具对 GitHub 进行分析。 

下面四张图的 Y 轴分别代表了 Pull Requests ,Pushes,Stars,Issues 的数量,蓝色的线代表 Objective-C ,浅橙色的线代表 Swift。 

 可以发现,在 Pull Request 方面,Swift 占比约 0.595%,而 Objective-C 占比约 0.335%

同时 Push 方面,Swift 占比约 0.476%,而 Objective-C 占比约 0.310%

在 Stars 方面,Swift 占比约 2.107%,而 Objective-C 占比约 1.067%

在 Issue 方面,Swift 占比约 0.767%,而 Objective-C 占比约 0.607%

总的来看,在 GitHub 的大环境中,社区中的开发者还是持续看好 Swift,也相对更加活跃,尤其在 Star 这项指标上可以明显看出,它高出了 Objective-C 近一倍!

商用 SDK 的技术选型

在今年我们还发现了一些有意思的现象,不少商用 SDK 也开始了 Swift 的迁移。

例如国外的 Nordic Semiconductor[28] 公司,它是北欧的一个半导体公司,主营蓝牙芯片,在业界属于领先地位,不少使用它家芯片的团队会涉及到固件升级问题,无线的升级方案需要进行固件传输、校验、升级管理等动作,而这些动作都得使用它们家提供的 SDK 来完成。

                                                                          

在 Nordic Semiconductor 的 GitHub 页面[29]上,我们可以看到目前提供的商用 SDK 中,iOS 端只有 Swift 版本[30],而 Android 端只有 Java 版本[31]。 

同时像 Google 的 Firebase 在其 RoadMap[32] 里也明确指出了将更加关注 Swift 的使用体验并开始了部分改造。 

相信不久的将来,会有越来越多的厂商加入到 Swift 的社区中,除了 Swift 是未来 这样人人都懂的道理以外,这两年新增的特性,例如 ABI 稳定,Module 稳定,以及 SPM 对 binary 组件的支持,都会导致厂商的态度改变,尤其是那些需要使用非源码形式发布组件的厂商,毕竟这些特性从根本上解决他们面临的工程问题。 

Apple 生态

SDK 能力

同样,我们继续分析了 Apple Developer Documentation[33] 下的 239 个 主题,发现今年的 Swift 独占和 Objective-C 独占的 SDK 情况如下

在 Swift 独占方面,新增了 3 个 SDK,分别是 Developer Tools Support,System,WidgetKit,其中 System[34] 是个用于进行底层文件操作(low-level file operation)的库,似乎这也是 Apple 的首个用 Swift 编写的系统底层库(PS:如果说的不对,还请各位读者指正);另外一个想说的重点就是 WidgetKit[35],这也是首次 Apple 在推广系统新特性的时候强制要求开发者必须使用 Swift 技术,这个策略我认为还是十分高明的,它为 Swift 技术的推广和应用找到了新的出路。 

 同时 Objective-C 独占方面,新增了一个 SCSIControllerDriverKit[36],但相比于去年,Professional Video Applications[37] 和 IOUSBHost[38] 两个 Objective-C 独有的 SDK 被改造成了 Swift 和 Objective-C 都可以使用的情况,而 QTKit 被彻底废弃了。 

至此,我们发现了,Swift 独占库的数量首次大于了 Objective-C 的独占库,是不是很有意思! 

原生 App 分析

国外的开发者 Timac[39] 在其文章《Apple’s use of Swift and SwiftUI in iOS 14》[40]里对 iOS14 中的 Swift 和 SwiftUI 的使用情况进行了分析。 

 iOS 14.0 包含了 291 个使用 Swift 技术的二进制文件(PS: 还有一个统计口径是 351 个,不过这里面有很多程序对 Swift 的使用很初级,所以 Timac 就将其排除了),这个数量比 iOS 13 多了一倍以上,另外 Swift UI 也在 iOS 14 上被广泛使用,目前已经有 43 个了,其中去年新增的翻译应用是完全使用 Swift 和 SwiftUI 编写的 App。 

iOS 中不同编程语言的发展

Timac 在其文章《Evolution of the programming languages from iPhone OS 1.0 to iOS 14》[41]给出了很多有意思的结论。  

首先,在 iOS 14 中,总共有 4173 个二进制文件,具体的列表可以参考 iOS 14.0 (18A373) 统计[42],其中:

  • 88% 使用 Objective-C

  • 17% 使用 C++

  • 8% 使用 Swift

  • 8% 全部使用 C

  • 1% 使用 SwiftUI

下面的图是 iPhone OS 1.0 到 iOS 14.0 中,各个二进制文件的情况,注意这里的二进制文件可以包含多个语言,所以下表的总数可能会大于二进制的总数,例如 iOS 14.0 里 44 + 351 + 337 + 708 + 3667 > 4173

从这个视角来看,也可以得出几个有意思的结论:

  • 首先,iOS 的每个版本都变得更加复杂

  • Swift 的使用在不断增多,而且至少目前来看,Swift 的使用已经超过了 C

  • Objective-C 的增长还是比较稳定的

  • C++ 的增长比较缓慢,或者说相当缓慢

  • C 的增加几乎没有变化

如果上面的图看起来不明显,我们可以通过这个图来看趋势。

当然上面的分析是基于数量来进行的,那么如果我们从体积上进行分析,也就是二进制大小的角度来看,又会得出怎样的结论呢?  

Timac 在其文章《Comparing iPhone OS 1.0 with iOS 14 using tree maps》[43]里,也给出了一些自己的解读。 

下面是 Timac 根据相关的数据和脚本绘制出来的 iOS 14 的 tree map(矩形式树状结构绘图法)[44] 

  • 其中 Preinstalled Assets 和 Linguistic Data 是与机器学习相关的预置资源  

  • Health 相关的内容在 iOS 14 的占比不算小,可以看出其重视程度 

  •  在 iOS 3.1 之后,提供了 dyld shared cache 技术,红色区域就是支持这个特性的 framework。

当然,Timac 对这个结果又进行了更细致的划分,它的结果如下

这里我们从二进制的大小,或者代码量的多少来考察某个系统功能的重要性,我们可以明显的看到,Apple 的人工智能推动了设备上的机器学习,如图像和视频中的物体检测、语言分析、声音分类和文本识别等技术。 

所以如果未来想继续在 iOS 上开发的话,机器学习可能会是一个必备的基础知识了(PS:如果你开发过 IntentConfiguration[45] 类型的小组件,我想你大概就明白我在说什么了)。

国内外客户端的使用现状

数据样本

去年我们分析了国内外 App 使用 Swift 的情况,今年我们继续走起。 

扫描的原理借鉴了《如何检测 iOS 应用程序是否使用 Swift?》[46],这是我和好基友 OneeMe[47] 一起编写的。 

App 排行榜的数据来源是 七麦数据[48] 提供的,日期为 2021 年 3 月 21 日,国内免费应用 Top 100 榜单[49] 和 国外免费应用 Top 100 榜单[50]

下面是扫描的结果:

在 GitHub 上,其实还有一份统计数据 Snake List[51],是 Flexih[52] 统计的,除了 Swift 技术外,还统计了 Weex,React Native,Flutter 等技术的情况,大家可以作为参考。

2021 年

在国外 Top 100 的免费应用中,Swift 混编占比 91%。

在国内 Top 100 的免费应用中,Swift 混编占比 59%。

在之前的文章中,《一次关于 Swift 在 iOS 生态圈里的现状调研》,我们也整理过一些数据。 

 在 2019 年,国内的 Swift 混编应用占比为 22%,国外的 Swift 混编应用占比 78%, 在 2020 年,国内的 Swift 混编应用占比为 30.4%,国外的 Swift 混编应用占比 82.3%。  

如果将近几年的数据连着看,Swift 在国内外的变化趋势如下图所示: 

数据解读

纯看数据的话: 

  •  在国内,Swift 混编占比达 59%,较去年的 30%,又增长了 29%,整体占比也已经过半了! 

  •  在国外,Swift 混编占比 91%,较去年的 82.3%,又增长 9%,纯 Objective-C 的应用也只有个位数占比了。 

那么我们再分析一些数据背后的内容: 

  • 从表面看,除了去年提到的 BAT 之外,今日头条,快手,滴滴,支付宝,京东,拼多多等一众应用也都在今年完成了 Swift 的初体验,比较有意思的是美团系的应用(美团,大众点评,美团外卖)目前似乎还没有任何动静。 

  •  虽然国内的 Swift 混编占比变高,但我个人认为,这并代表国内大部分公司要开始转型 Swift 技术了,这样的变化,主要是因为去年 Apple 新增的 Widget 技术导致的,因为想开发 Widget 必须使用 Swift 相关的技术,而上面提到的各个应用,大多都提供了相应的小组件。 

  •  如果历史有可以借鉴的地方,那么 2021 年的国内 Swift 占比(59%)与 2019 年的国外占比(78%)还算比较接近,至少不像去年(30% 和 82.3%)的差距那么大,那么按照这个趋势发展的话,我们是否可以预言在未来的 3-5 年内,国内的 Swift 混编应用占比也将达到 90% 左右?

PS:在写这篇文档的时候,发现微博也支持小组件了,所以估计上面的这个数据又得增加 1% 了。

总结与展望

在做完了今年的调研后,我们能得出什么结论呢? 

  •  虽然看起来现阶段的 Swift 还是在一个积累的过程,但随着 WidgetKit 这个标志性的 SDK 诞生,我相信这个发展阶段会从积累阶段慢慢转向发展期,毕竟现在 ABI 稳定了,Module 稳定了,对二进制组件的支持也有了,还有 Swift 语言本身的版本变化也逐渐稳定了,这些都给与了 Swift 很好的支持。 

  • Swift 的发展方向绝不只是为了 Apple 生态体系内的那点事儿,这个从社区的规划也好,从 Timac 的那几篇分析文章也好,我们都可以看出它在多元发展上的决心,Swift 真的很想破圈。 

  • 国内的 Swift 发展被去年的 iOS 14 新特性给盘活了,WidgetKit 功不可没,虽然还不能给出大部分公司都将转型的结论,但至少绝大部分互联网的头部公司已经兼容了 Swift 的开发,这是一个好的开始,相信在可见的未来,Apple 的转型决心必然会让国内的公司会更加重视这方面工作的重要性。

在最后,我来说说这一年的一些其他见闻:  

虽然不久前 Google 归档了 Swift for TensorFlow[53] 项目,让很多人看衰 Swift 在机器学习或者人工智能方面的发展,但其实我觉得是有点没必要,Swift 在这方面的发展其实并不依赖 Google,Apple 自己在这方面就很有建树,如果感兴趣应该看看 Machine Learning Research at Apple[54] 这个网站,这才代表 Apple 和 Swift 在机器学习方面的真实水平。  

另外,虽然还是能在某些技术群里看到 "Swift 无用","Swift 火不了","我们不需要用 Swift 开发" 的字眼,但这样的数量相比于前几年而言,真的越来越少了。 

 另外据我所知,字节跳动的抖音团队会在 2021 年的 Q2 季度全部迁移成 Swift 技术栈,这个迁移不仅是上层的业务变动,似乎也包括了底层的基础库,这意味着他们在不远的未来将会统一使用 Swift 进行开发;同时,我也听说了快手团队正在大力发展 Swift 方面的建设。  

虽然这只是国内诸多公司的个例,但我相信随着这些头部大厂的加入,Swift 成为原生开发的主流趋势会在国内越来越明显,当然不得不承认,跨端技术在国内也有着极大的市场份额,所以估计未来作为 iOS 端上的程序员,可能要具备 Objective-C,Swift,JavaScript/TypeScript 和 Flutter 的语言技术栈。 

好了,今年的调研报告就到此结束了,我们明年见!

点击获取:iOS面试资料

参考文档

  • SketchK - 一次关于 Swift 在 iOS 生态圈里的现状调研

  • Paul Hudson - Hacking with Swift - What’s new in Swift 5.3?[55]

  • Paul Hudson - Hacking with Swift - What’s new in Swift 5.4?[56]

  • Swift.org forum - On the road to Swift 6[57]

  • TIOBE[58]

  • PYPL[59]

  • GitHut 2.0[60]

  • Apple - Apple Developer Documentation[61]

  • Timac - Comparing iPhone OS 1.0 with iOS 14 using tree maps[62]

  • Timac - Evolution of the programming languages from iPhone OS 1.0 to iOS 14[63]

  • Timac - Apple’s use of Swift and SwiftUI in iOS 14[64]

  • Timac - 如何检测 iOS 应用程序是否使用 Swift?

  • OneeMe - Swift App Analyzer[65]

  • Flexih - Snake List[66]

  • Apple - Machine Learning Research at Apple[67]

参考资料

[1] SE-0276: github.com/apple/swift…  

[2] SE-0279: github.com/apple/swift…  

[3] SE-0266: github.com/apple/swift…  

[4] SE-0269: github.com/apple/swift…  

[5] SE-0281: github.com/apple/swift… 

 [6] SE-0267: github.com/apple/swift… 

[7] SE-0280: github.com/apple/swift… 

[8] SE-0277: github.com/apple/swift… 

 [9] SE-0268: github.com/apple/swift… 

[10] SE-0271: github.com/apple/swift… 

[11] SE-0278: github.com/apple/swift…  

[12] SE-0272: github.com/apple/swift… 

[13] SE-0273: github.com/apple/swift…  

[14] SE-0287: github.com/apple/swift…  

[15] SE-0284: github.com/apple/swift… 

[16] SE-0289: github.com/apple/swift… 

 [17] SR-10069: bugs.swift.org/browse/SR-1… 

[18] SE-0294: github.com/apple/swift…  

[19] SE-0281: github.com/apple/swift… 

[20] Ted Kremenek: twitter.com/tkremenek?r… 

[21] swift.org forum: forums.swift.org/categories 

 [22] On the road to Swift 6: forums.swift.org/t/on-the-ro… 

 [23] Saleem Abdulrasool: github.com/compnerd 

 [24] Tom Doron: github.com/tomerd 

 [25] TIOBE: www.tiobe.com/tiobe-index… 

 [26] PYPL: pypl.github.io/PYPL.html 

 [27] GitHut 2.0: madnight.github.io/githut/#/pu…

 [28] Nordic Semiconductor: www.nordicsemi.com/ 

 [29] GitHub 页面: github.com/NordicSemic… 

 [30] Swift 版本: github.com/NordicSemic… 

 [31] Java 版本: github.com/NordicSemic… 

 [32] RoadMap: github.com/firebase/fi…

 [33] Apple Developer Documentation: developer.apple.com/documentati… 

 [34] System: developer.apple.com/documentati… 

 [35] WidgetKit: developer.apple.com/documentati… 

 [36] SCSIControllerDriverKit: developer.apple.com/documentati… 

 [37] Professional Video Applications: developer.apple.com/documentati… 

 [38] IOUSBHost: developer.apple.com/documentati… 

 [39] Timac: github.com/Timac 

 [40] Apple’s use of Swift and SwiftUI in iOS 14: blog.timac.org/2020/0927-s… 

 [41] Evolution of the programming languages from iPhone OS 1.0 to iOS 14: blog.timac.org/2020/1019-e… 

 [42] iOS 14.0 (18A373) 统计: blog.timac.org/2020/1019-e…

 [43] Comparing iPhone OS 1.0 with iOS 14 using tree maps: blog.timac.org/2020/1122-c…

 [44] 矩形式树状结构绘图法: www.wikiwand.com/zh/%E7%9F%A… 

 [45] IntentConfiguration: developer.apple.com/documentati… 

 [46] 如何检测 iOS 应用程序是否使用 Swift?: mp.weixin.qq.com/s/vF\_oOWFL… 

 [47] OneeMe: github.com/OneeMe

 [48] 七麦数据: www.qimai.cn/ 

 [49] 国内免费应用 Top 100 榜单: www.qimai.cn/rank/index/…

 [50] 国外免费应用 Top 100 榜单: www.qimai.cn/rank/index/…

 [51] Snake List: github.com/flexih/Snak…

 [52] Flexih: github.com/flexih

 [53] Swift for TensorFlow: github.com/tensorflow/…

 [54] Machine Learning Research at Apple: machinelearning.apple.com/

 [55] Paul Hudson - Hacking with Swift - What’s new in Swift 5.3?: www.hackingwithswift.com/articles/21…

 [56] Paul Hudson - Hacking with Swift - What’s new in Swift 5.4?: www.hackingwithswift.com/articles/22…

 [57] Swift.org forum - On the road to Swift 6: forums.swift.org/t/on-the-ro…

 [58] TIOBE: www.tiobe.com/tiobe-index…

 [59] PYPL: pypl.github.io/PYPL.html

 [60] GitHut 2.0: madnight.github.io/githut/#/pu…

 [61] Apple - Apple Developer Documentation: developer.apple.com/documentati… 

 [62] Timac - Comparing iPhone OS 1.0 with iOS 14 using tree maps: blog.timac.org/2020/1122-c…

 [63] Timac - Evolution of the programming languages from iPhone OS 1.0 to iOS 14: blog.timac.org/2020/1019-e… 

 [64] Timac - Apple’s use of Swift and SwiftUI in iOS 14: blog.timac.org/2020/0927-s…

 [65] OneeMe - Swift App Analyzer: github.com/ZRTransmitt…

 [66] Flexih - Snake List: github.com/flexih/Snak…

 [67] Apple - Machine Learning Research at Apple: machinelearning.apple.com/ 

文章到这里就结束了,你可以私信我及时获取 iOS开发 以及面试相关资料。如果你有什么意见和建议欢迎给我留言。

请iOS的小伙伴关注 !喜欢的话给一个赞吧!谢谢!谢谢!谢谢

原文链接:blog.csdn.net/Desgard\_Du…