Swift的使用体验与生态发展之路

swift 是一门多范式的编译型语言,是 apple 生态中的重要开发工具 。官网介绍 swift 的设计目的是让开发者们更容易编写和维护正确的程序,使用体验如下 :
安全:所有编码行为都以安全的方式进行。
快速:为了替代基于 c 的语言(c、c++、objective-c),swift 的性能必然不能相差太多,且必须持续可预测的,而不只是在一些特定情况下。
表达力强:受益于计算机科学几十年的发展,swift 提供了足够有乐趣、现代的开发过程,且仍然在持续发展中。
swift logo
# 诞生 #    
在 wwdc 2010 期间,chris lattner 刚带团队经过大量的努力完成了 clang 对 c++ 语言的支持,任务完成虽然开心,但其中真正细节的工作也让人感到无比心累,由此 chris lattner 萌生了创造更好的语言的想法 [3]。
最开始 chris lattner 只是和  bertrand serlet、dave zarzycki 讨论这个新语言的设计,语言名字叫“shiny”,寓意“you’re building a shiny new thing”。当时虽然已经有了很多想法,但新语言的未来其实是完全不确定的,因此在 bertrand serlet 的推动下,一些想法先在 objective-c 得到了实现,比如 arc、modules 甚至是 literals,这些特性都来自于背后 swift 初期的一些讨论。但也有 objective-c 无法实现的,比如内存安全,要实现内存安全意味着大部分 c 代码都要被移除,那 objective-c 也不再是 objective-c 。
chris lattner 自己实现了大部分基本架构,但一个人不可能完成所有,2011 年 4 月经过与管理层讨论后,chris lattner 开始拉人入伙。这也是 swift 第一次在内部公开被审视,不可避免地收到了很多刺耳的反馈,但这可能也是很多项目成长的必经之路,批判同时意味着关注,其中可能也指明了未来的方向。
团队化运作后 swift 发展飞快,2013 年 7 月开始 swift 成为了苹果开发者工具部门的重点项目 。在闭门开发 4 年后,2014 年 swift 正式发布,当时官宣标签是“objective-c without c”,swift 在设计上就可以与 objective-c 共存。
# 演进 #    
swift 1.0 在 wwdc 2014 首次亮相,由当时苹果的软件工程高级副总裁 craig federighi 正式发布,并邀请 chris lattner 上台做了 demo 演示。发布后第一个月的下载就超过了 1100 万 。
2015 年初 stack overflow 的调研中,swift 是最受喜爱的编程语言 [6]。2015 年 11 月 swift 正式开源,代码托管在 github,第一周的 clone 超过了 6 万 ,可见初期开发者对于 swift 的好奇与热情。
2015 年 stack overflow 调研:最喜欢的语言
但 swift 在 3.0、4.0 时期,一直有稳定性问题,几乎每年都有大变动,有一些更新是向后不兼容的,也意味着这个阶段的 swift 还未准备好应用于大型商业项目。
2019 年 swift 5.0 发布,终于带来了 abi 稳定。swift 5.0 后,不再引入大的变动,不同版本的 swift 最终可以编译为同一个 app,这标志着 swift 语言的成熟。2019 年另一个标志性事件是 swiftui 发布,意在统一所有苹果设备的开发体验。
swift 的 tiobe 指数变化及一些关键演进 
目前 swift 有完整的工具链支撑开发,融入了苹果的开发者生态,替代 objective-c 成为主流的苹果生态开发语言已是必然趋势。
2021 年 jetbrains 开发者调研:swift and objective-c 开发者人数对比 
值得一提的是,chris lattner 在 2017 年离开苹果加入了谷歌,在谷歌期间主导了 s4tf 项目,这也是 swift 在 ai 领域的一次重要尝试。2020 年 chris lattner 从谷歌离职,开始了 ai 编译器的探索,目前 s4tf 项目已是归档状态,但这个尝试验证了 swift 应用于 ai 的可行性 ,swift 在性能上较 python 有一定优势。
# 苹果官方生态 #    
# 工具链
官方提供的工具链是 swift 生态的核心部分,除了 swift 的编译器、标准库等,苹果还提供了一系列支撑学习、开发的优秀工具:
核心库 :核心库提供了比标准库更高级的功能,包括常用的数据、字符集合,单元测试,日期计算等。
调试器 & repl :基于 lldb 调试器开发的调试环境,同时也是交互式解释器。
包管理 spm :与 swift 构建系统集成,可以自动化下载、编译和链接依赖的过程。苹果官方还未提供中心仓服务,仍需要通过 git 来下载三方库,三方库的注册服务已有计划,但仍未发布 。
playgrounds :2016 年发布,是一款适用于 ipad 的教育类 app,2022 年 5 月发布的 4.1 版本开始适用于 ipad 与 mac,不仅仅是一款教育类 app,也可以用于开发,其中利用 ipad 性能开发的轻点拖拽等操作,进一步提升了编码过程的互动性。
# 框架
2019 年 wwdc 上,苹果发布了基于 swift 的声明式框架 swiftui,可以用于开发 watchos、macos、ios 等平台,基本上涵盖了所有苹果产品的系统。
swift 和 swfitui 可以说是直接从语言和开发工具层面直接统一了开发者的开发体验。在 swiftui 推出之前,苹果不同设备的开发框架并不互通,移动端和桌面端的开发需要掌握不同的知识内容,移动端开发者需要使用 uikit,桌面端的开发者需要使用 appkit,watchos 的开发者需要使用一种类似堆叠的逻辑 。
swiftui 针对现有的问题给出了一些解决思路,声明式编程对比指令式的编程又加了一层抽象,比如坐标、宽度、字形字号等变量由系统接管,开发者只需要直观地告诉系统需要放置一个图像、加点文字等,由此,swiftui 的代码量小了很多,也可以更方便地适配不同尺寸的设备。此外,在数据流通方面,swiftui 在 combine 的协助下实现了单一数据源的管理 。
在开发者的实际体验中,代码量和可读性无疑都有了本质性的提升 。
wwdc 2019 swiftui demo 
但近期也有开发者表明自己在尝试应用 swiftui 到项目时遇到了问题,比如不好用的实时检查器、延迟问题等,最终直言要暂时放弃 swiftui 。
不可否认 swiftui 提供了一些很棒的思路,但目前仍未非常成熟,在真正的应用中还未达到设想的效果,要想替换 appkit、uikit 还有很长一段路要走。
# 学习 swift
苹果为了追求不同设备上用户体验的一致,对于软件开发有一套非常详细严格的标准;但又必须降低开发门槛来吸引更多开发者开发苹果设备软件,因此开发工具必须足够易学好用,才能解决这个矛盾 [16]。swift 在设计上就是一门易学习的编程语言,同时又有很多现代编程语言的特性,上限很高。
除了语言设计,文档也是学习一门语言的关键。苹果官方提供了学习文档和代码规范,也有大量三方组织或个人分享了优秀的视频图文教程,特别是对于初学者来说,可以大大降低学习成本。
此外,为了开发者能更快上手 swift,苹果也提供了大量好用的工具,其中 playgrounds 以代码玩游戏的设计理念更是革命性的,即使是没有编码基础的人,也可以通过 playgrounds 迅速掌握 swift。
swift playgrounds demo
# 社区 #    
# swift 开源
2015 年 swift 正式开源,开源后社区可以直接参与到 swift 的设计和实现。已开源的部分包括编译器、标准库、核心库、lldb 调试器、包管理和 xcode 的 playground 支持 。
不过 swift 开源项目中超过 90% 的提交还是来自苹果(除去 ci、未知等账号的提交),其次谷歌有 800+ 次提交,但占比还不到 1%,剩下其他团队或个人的提交都不超过 500 次。
除了直接贡献代码,开源社区也是用户与项目开发团队直接沟通的重要渠道,用户可以通过提交 issue 来反馈问题和建议。从 swift 编译器项目中所有 issue 来看,每月新建 issue 数在逐渐减少,同时 bug、compiler 相关的 issue 数量也在逐年下降,印证了项目的稳定性。
每月新建 issue 数量
每年相关标签的 issue 数量
# 开发者社区
发布后开发者社区即用户社区,是语言演进非常直接的驱动力,编程语言项目团队里的开发者是写编译器的人,但可能用的还是 c++,社区里的开发者才是每天在使用 swift 的人!用户真正的需求甚至可能改变最初设计者的想法,比如最开始 swift 核心团队认为语言不需要 result,但社区有很多声音说“我们需要”,因此 swift 5 又加入了 result 。
在语言本身的语法模块都已经稳定的情况下,社区的活跃度可以反映语言的流行程度。
swift 在 stack overflow 的热度自 2016 年后持续下降,相反 dart 从 2018 年至今热度在持续升高;在 swift 各版本的对比中,一般刚发布后会有一个高峰,随后逐渐下降,近 3 年,只有 swiftui 的热度相对较高且稳定 [21]。
stack overflow 中语言热度
stack overflow 中 swift 各版本热度
# 开发者调研
slashdata 2022 年的开发者生态报告中估计 swift 开发者人数在 3500 万,较去年的 2500 万上升了 40%,不过因为大部分开发者还是和 objective-c 一起使用,且由于 objective-c 在嵌入式设备和 ar/vr 领域的应用, objective-c 开发者的人数也上升了 50% 。
开发者社区活跃人数 
jetbrains 2021 年的 swift/objective-c 开发者调研中,有 84% 的开发者表示自己同时使用 swift 和 objective-c,其中已经有 64% 的开发者大部分代码是 swift。
jetbrains 开发者调研:是否同时使用 swift 和 objective-c 
调研中绝大部分开发者(89%)并不使用 swift 开发服务端项目,swift 更多还是应用于客户端开发。
jetbrains 开发者调研:是否使用 swift 开发服务端项目 [9]
# 三方库
对比 java、python 等语言,swift 的三方库数量并不算很多。目前因为 cocoapods 有索引功能,仍有大量开发者使用 cocoapods 来管理项目依赖且短期内不会用 spm 替换 [9]。cocoapods 上共有 9 万多 swift 和 oc 的库,其中搜索 swift 的结果为 1 万多 。
jetbrains 开发者调研:使用什么工具管理依赖 
另外虽然官方没有提供三方库注册服务,但 github 有一个开源项目 swift package index,目前已收集了近 5000 个 github 上的 swift 项目 [24],其中 json、cli 和 networking 等标签相关的仓库较多(剔除了不同系统、框架等相关标签)。
swift package index 中的仓库相关标签
2016 年至今每年新建的库数量并没有明显增长,甚至 2021 年、2022 年新建的库数量有所减少,不过其中约 70% 库仓库今年仍有过活跃行为。
swift package index 中的仓库创建年份
# 应用 #    
# 官方应用
根据开发者 timac 关于苹果使用 swift 和 swiftui 的分析报告 [25],ios 15 中二进制文件共 4738 个,其中使用了 swift 的二进制文件共 607 个(占比 13%),使用了 swiftui 的二进制文件共 114 个(占比 2%),使用最多的语言仍然是 objective-c,占比 89%。对比 ios 14 中,使用了 swift 的二进制文件占比为 8.4%,使用了 swiftui 的二进制文件占比仅为 1%,占比均有所提高。
ios 系统中二进制文件使用编程语言情况
ios 系统的编程语言仍然以 objective-c 为主,且短时间内不会完全替换,但苹果官方对于 swift、swiftui 的应用在不断加速,ios 15 中常用应用如 app store、health、分屏等已开始使用 swift,其他如 books、maps、notes 等已开始使用 swiftui。swift 基本上还是会和 objective-c 一起使用,还不能完全剔除 objective-c。
在 macos 中,也可以非常明显地看到应用 swiftui 的增长,从 monterey 到 ventura,使用了 swiftui (可能同时使用了 appkit)的比例从 4% 上升到了 10% 。
macos 系统中三种 ui 框架的使用占比
整体来看,苹果官方的策略是从风险较低的少量应用开始试验,随着每次系统更新和 swift、swiftui 的演进,使用比例在不断加大。
# 第三方应用使用 swift 情况
2019 年到 2021 年,国内 top 100 的免费应用中,swift 混编应用的占比从 22% 上升到了 78%;国外 top 100 的免费应用中,swift 混编应用的占比一直较高,2019 年已有 78%,2021 年达到了 82.3% 。
国内外 top 100 应用中 swift 混编应用占比的变化趋势 
国内互联网头部厂商基本上都已经支持 swift,但也不能代表未来将转型 swift 技术。swift 混编应用占比迅速提高的原因可能是受 2020 年新增的 widgetkit 导致的,开发者若要提供应用小组件则必须使用 swift 相关技术 [27]。
# github 开源项目
2016 年至 2021 年,github 上 swift 开源项目每年新增数量变化不大,基本在 15000 至 20000 之间。github 上 swift 开源项目增长呈现的平稳趋势和前文 swift 三方库增长、swift 在 stack overflow 的讨论度变化基本一致,后续 swift 大概率会逐步替换现有代码,有稳定的市场份额,但暂无大规模爆发的契机。
github 上 swift 开源项目每年新增数量
*数据来源:gh archive 
# 总计 #    
swift 已经 abi 稳定,语言本身基本完善。作为 objective-c 的替代产品,与 objective-c 兼容,足够安全、高性能,且易于学习阅读,下限低而上限高;同时有苹果官方的支持,官方系统中每年使用 swift 混编的原生应用占比在逐年提升,官方发布的 sdk 也可能绑定使用 swift。
但重要的框架 swiftui 还处于成长阶段,大部分场景 swift 仍需要与 objective-c 混编使用,很难单独支撑起大型项目的搭建;三方生态发展缓慢,比如在服务端、机器学习、ar/vr 等领域都没有长足发展,目前基本还是应用于客户端开发场景。
近几年 swift 的成长不算快,应用领域相对单一,暂时没有爆发契机,但在苹果开发者生态中会继续稳定发展,在官方支持下可以逐步替换 objective-c。下一个机会点也许在苹果新的设备,我们拭目以待。


使用稀疏计算和Facebook Glow进行神经网络优化
你了解人工智能哪一些行业观点
宏途创联科技有限公司A轮融资 投后估值过亿元
!销售/回收hp8508a矢量电压表HP8508A 小兵/罗
多用DC-DC/LDO/Reset复合电路应用
Swift的使用体验与生态发展之路
AMETEK氧化锆氧分析仪的工作原理和常见故障有哪些
直川科技无线物联网倾角传感器服务于中国高铁
数字电子技术之逻辑门电路的讲解
全球物联网百家争鸣 中国有望成为全球物联网领航者
STM32基础知识:PWM控制舵机
Windows 10 ARM手机备用电池问题解决
内嵌核心板出现电磁兼容性问题的有效解决方案
不锈钢角座阀的注意事项都有哪些
乐视网8030万元债务本息违约
2016年全球移动宽带收入或接近1万亿美元
基于Buck电路的直流稳压电源设计案例
如何将Linux2.4移植到ARM平台的嵌入式系统
人脸识别会成为潘多拉魔盒吗
S7-300 PLC:I/O 访问故障组织块