让我们一起看看 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 提了三点:
- 加速整个 Swift 软件生态的发展:包含兼容更多的开发平台,简化软件的安装部署和大力发展各类工具库。
- 打造极致的开发体验:包括更快的构建速度,更好用的调试工具,更灵敏的代码补全和更丰富的诊断信息。
- 结合开发者的反馈进一步发展语言特性:包括完善 API 的设计,拓展其在底层系统,服务器和机器学习方面的应用场景,同时对某些主流的语言特性提供支持,例如并发特性和内存相关的特性。
同时 Swift 的核心团队也发生了一些变化,Saleem Abdulrasool 和 Tom 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 不要被打脸)
技术社区
语言排行榜
同样我们来看一看编程语言排行榜 TIOBE 和 PYPL 的情况,在 TIOBE 的排行榜中,Swift 在今年的排名是第 15 名,而 Objective-C 已经彻底排在了 20 名之外了。
而在 PYPL 的排行榜中,Swift 和 Objective-C 的热度还是较为接近的。
从社区的语言排行榜来看,虽然乍一看,感觉还是 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%
同时 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 公司,它是北欧的一个半导体公司,主营蓝牙芯片,在业界属于领先地位,不少使用它家芯片的团队会涉及到固件升级问题,无线的升级方案需要进行固件传输、校验、升级管理等动作,而这些动作都得使用它们家提供的 SDK 来完成。
在 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 Applications 和 IOUSBHost 两个 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。
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
从这个视角来看,也可以得出几个有意思的结论:
- 首先,iOS 的每个版本都变得更加复杂
- Swift 的使用在不断增多,而且至少目前来看,Swift 的使用已经超过了 C
- Objective-C 的增长还是比较稳定的
- C++ 的增长比较缓慢,或者说相当缓慢
- C 的增加几乎没有变化
如果上面的图看起来不明显,我们可以通过这个图来看趋势。
当然上面的分析是基于数量来进行的,那么如果我们从体积上进行分析,也就是二进制大小的角度来看,又会得出怎样的结论呢?
Timac 在其文章《Comparing iPhone OS 1.0 with iOS 14 using tree maps》里,也给出了一些自己的解读。
下面是 Timac 根据相关的数据和脚本绘制出来的 iOS 14 的 tree map(矩形式树状结构绘图法)
- 其中 Preinstalled Assets 和 Linguistic Data 是与机器学习相关的预置资源
- Health 相关的内容在 iOS 14 的占比不算小,可以看出其重视程度
- 在 iOS 3.1 之后,提供了 dyld shared cache 技术,红色区域就是支持这个特性的 framework。
当然,Timac 对这个结果又进行了更细致的划分,它的结果如下
这里我们从二进制的大小,或者代码量的多少来考察某个系统功能的重要性,我们可以明显的看到,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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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%。
在国内 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 项目,让很多人看衰 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