让我们一起看看 Swift 生态在 2021 年的现状吧!

回顾 2020

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

Swift 语言

版本变化

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

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

  • SE-0276:catch 语句在捕获 error 的时候,可以更加灵活自由,例如一次捕获多个 error 或者对 error 的值进行绑定。
  • SE-0279:支持多个尾随闭包,这个特性主要是为 SwiftUI 准备的。
  • SE-0266:enum 支持 comparable 协议,并根据顺序自行决定大小
  • SE-0269:在某些场景下可以避免 self 关键字的声明
  • SE-0281:通过 @main 关键字定位程序入口
  • SE-0267:在函数的泛型和扩展中就可以使用包含 where 关键字的语句
  • SE-0280:protocol witness 匹配模型在枚举值中的加强
  • SE-0277:新增 Float16 的数据类型
  • SE-0268:didSet 方法优化和语义更新
  • 首先在 SE-0271 中,Swift Package Manager 在资源文件的支持上有了进一步的提升,同时,在 SE-0278 中,SPM 对本地化资源的支持也有了改进,而且在 SE-0272 中,SPM 终于支持了二进制形式的组件。在 SE-0273,SPM 允许我们对特定的 target 进行特殊的依赖配置。

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

  • SE-0287:提升了隐式成员表达式的类型推断能力。
  • SE-0284:在函数中可以定义多个可变参数。
  • SE-0289:在 5.1 就公布的 Function Builder 功能正式命名为 Result Builder,并在原先的基础上进行了完善。
  • SR-10069:嵌套函数支持重载
  • SE-0294:新增 executable 类型的 target,使得 SE-0281 新增的特性更易于使用。
  • property wrapper 除了可以作为属性外,还可以在函数里作为本地变量。

On the road to Swift 6

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

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

  1. 加速整个 Swift 软件生态的发展:包含兼容更多的开发平台,简化软件的安装部署和大力发展各类工具库。
  2. 打造极致的开发体验:包括更快的构建速度,更好用的调试工具,更灵敏的代码补全和更丰富的诊断信息。
  3. 结合开发者的反馈进一步发展语言特性:包括完善 API 的设计,拓展其在底层系统,服务器和机器学习方面的应用场景,同时对某些主流的语言特性提供支持,例如并发特性和内存相关的特性。

同时 Swift 的核心团队也发生了一些变化,Saleem AbdulrasoolTom Doron 作为新成员加入到核心团队,而 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 不要被打脸)

技术社区

语言排行榜

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

image.png

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

image.png

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

社区活跃度

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

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

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

image.png

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

image.png

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

image.png

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

image.png

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

商用 SDK 的技术选型

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

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

image.png

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

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

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

Apple 生态

SDK 能力

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

维度 个数 SDK 名称
Swift 独占 13 Swift(Swift Standard Library),Combine,SwiftUI,RealityKit,CareKit,Create ML(Create ML, Create MLUI),Playground Support,PlaygroundBluetooth,Apple CryptoKit,Swift Packages(Swift Package Manager),Developer Tools Support,System,WidgetKit
Objective-C 独占 12 DarwinNotify,DriverKit(macOS 专属),EndpointSecurity(macOS 专属),HIDDriverKit(macOS 专属),Kernel(macOS 专属),NetworkingDriverKit(硬件驱动相关),PCIDriverKit(硬件驱动相关),SerialDriverKit(硬件驱动相关),USBDriverKit(硬件驱动相关),USBSerialDriverKit(硬件驱动相关),xcselect (macOS 专属),SCSIControllerDriverKit

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

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

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

原生 App 分析

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

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

image.png

iOS 中不同编程语言的发展

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

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

  • 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

image.png

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

  • 首先,iOS 的每个版本都变得更加复杂
  • Swift 的使用在不断增多,而且至少目前来看,Swift 的使用已经超过了 C
  • Objective-C 的增长还是比较稳定的
  • C++ 的增长比较缓慢,或者说相当缓慢
  • C 的增加几乎没有变化

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

image.png

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

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

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

image.png
  • 其中 Preinstalled Assets 和 Linguistic Data 是与机器学习相关的预置资源
  • Health 相关的内容在 iOS 14 的占比不算小,可以看出其重视程度
  • 在 iOS 3.1 之后,提供了 dyld shared cache 技术,红色区域就是支持这个特性的 framework。

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

image.png

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

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

国内外客户端的使用现状

数据样本

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

扫描的原理借鉴了《如何检测 iOS 应用程序是否使用 Swift?》,相应的工具可以参考 Swift App Analyzer,这是我和好基友 OneeMe 一起编写的。

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

下面是扫描的结果:

序号 国内 App 版本 是否使用 Swift 国外 App 名称 是否使用 Swift
01 搜狗输入法 NO Twitter YES
02 百度地图 YES Uber YES
03 招商银行 YES Fontise YES
04 优酷 YES Prime Video YES
05 QQ浏览器 NO Nike YES
06 QQ音乐 YES Dasher YES
07 肯德基 YES Capital One YES
08 抖音极速版 NO PayPal YES
09 中国建设银行 YES Twitch YES
10 饿了么 NO Telegram YES
11 携程旅行 YES Translate YES
12 闲鱼 NO TV Remote YES
13 汽车之家 NO Life360 YES
14 WiFi 万能钥匙 YES Google Photos YES
15 微视 YES Walgreens YES
16 菜鸟 YES Pinterest YES
17 高德地图 NO Vrbo YES
18 知乎 YES Chase YES
19 手机营业厅 YES Starbucks YES
20 国家反诈中心 NO Pandora YES
21 58 同城 YES Google Docs NO
22 淘宝特价版 NO Waze YES
23 UC 浏览器 NO Credit Karma YES
24 小红书 YES MM Live YES
25 微博 NO Facebook YES
26 芒果TV NO Amazon Alexa YES
27 天眼查 NO Snapchat YES
28 驾考宝典 NO Coinbase YES
29 探探 YES Xbox YES
30 个人所得税 NO ClassDojo YES
31 腾讯地图 NO Walmart YES
32 SOUL YES Google Maps NO
33 美柚 YES PicsArt YES
34 轻颜相机 YES Chrome NO
35 BOSS 直聘 NO Hulu YES
36 快手极速版 YES Outlook YES
37 作业帮 YES Disney+ YES
38 美团秀秀 YES CapCut YES
39 Chrome NO Booking.com YES
40 迅雷 YES Instagram YES
41 贝壳找房 YES Zelle YES
42 WPS Office YES Messenger NO
43 百度网盘 YES SHEIN YES
44 美团外卖 NO Google Duo YES
45 番茄小说 NO Zoom NO
46 中国工商银行 YES Roku YES
47 快手 YES Target YES
48 美颜相机 YES WhatsApp YES
49 七猫小说 YES Grubhub YES
50 滴滴出行 YES Postmates YES
51 微信 YES PS App YES
52 韩剧 TV YES Tinder YES
53 酷狗音乐 NO Hopper YES
54 唯品会 YES Shazam YES
55 爱奇艺 YES Itsme YES
56 哔哩哔哩 YES Bird YES
57 阿里巴巴 NO Uber Eats YES
58 京东金融 NO Netflix YES
59 醒图 YES Domino’s YES
60 网易云音乐 YES Arch-US YES
61 支付宝 YES DoorDash YES
62 转转 YES Fetch Rewards YES
63 叮咚买菜 YES CBS Sports YES
64 今日头条 YES Shop YES
65 邮储银行 NO Spotify YES
66 懂车帝 YES TikTok YES
67 夸克 YES Lyft YES
68 美团 NO SoundCloud YES
69 喜马拉雅 YES WOMBO YES
70 得物(毒) YES Zillow YES
71 中国农业银行 NO TextNow YES
72 QQ 邮箱 YES HBO Max YES
73 钉钉 NO Discord YES
74 百度 YES Amazon Music YES
75 Top Widgets YES Google YES
76 Keep YES Google Drive YES
77 全民 K 歌 NO Airbnb YES
78 哈罗出行 NO Tubi YES
79 中国银行 YES Etsy YES
80 Days Matter YES IRL YES
81 新氧医美 NO Yelp YES
82 安居客 YES Peacock YES
83 企业微信 NO YouTube Music YES
84 中国移动 YES Venmo YES
85 手机淘宝 YES ESPN YES
86 云闪付 NO IRS2Go NO
87 QQ NO Ring YES
88 交管 12123 NO Wish YES
89 拼多多 YES ESPN YES
90 京东 YES Gmail YES
91 好看视频 YES Amazon NO
92 铁路 12306 NO Robinhood YES
93 大麦 YES YouTube NO
94 大众点评 NO Reddit YES
95 酷狗铃声 NO OfferUp YES
96 抖音 NO Musi NO
97 剪映 YES Widgetsmith YES
98 货拉拉 NO eBay YES
99 腾讯会议 NO Chick-fil-A YES
100 腾讯视频 NO Cash App YES

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

2021 年

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

image.png

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

image.png

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

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

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

image.png

数据解读

纯看数据的话:

  • 在国内,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 项目,让很多人看衰 Swift 在机器学习或者人工智能方面的发展,但其实我觉得是有点没必要,Swift 在这方面的发展其实并不依赖 Google,Apple 自己在这方面就很有建树,如果感兴趣应该看看 Machine Learning Research at Apple 这个网站,这才代表 Apple 和 Swift 在机器学习方面的真实水平。

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

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

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

参考文档

SketchK - 一次关于 Swift 在 iOS 生态圈里的现状调研 Paul Hudson - Hacking with Swift - What’s new in Swift 5.3? Paul Hudson - Hacking with Swift - What’s new in Swift 5.4? Swift.org forum - On the road to Swift 6 TIOBE PYPL GitHut 2.0 Apple - Apple Developer Documentation Timac - Comparing iPhone OS 1.0 with iOS 14 using tree maps Timac - Evolution of the programming languages from iPhone OS 1.0 to iOS 14 Timac - Apple’s use of Swift and SwiftUI in iOS 14 Timac - 如何检测 iOS 应用程序是否使用 Swift? OneeMe - Swift App Analyzer Flexih - Snake List Apple - Machine Learning Research at Apple