Swift 6 准备就绪
Swift 6 语言模式可在编译时防止数据竞争。当您选择 Swift 6 模式时,编译器会在您的代码存在并发访问风险时产生错误,从而将难以调试的运行时故障转化为编译器错误。
为了追踪 Swift 软件包生态系统的进展,Swift Package Index 正在对索引中的所有软件包运行定期的软件包兼容性检查。
如需帮助迁移项目代码,请参阅Swift 6 语言模式迁移指南。
零数据竞争安全错误的 Swift 6 软件包总数
此图表显示在至少一个测试平台上成功构建期间,数据竞争安全编译器诊断为零的软件包。
Swift 6 数据竞争安全错误总数
此图表显示所有软件包中所有数据竞争安全诊断的总数。
常见问题
问:什么是“数据竞争安全错误”?
答:Swift 6 引入了完整的并发检查,这是一种编译器功能,用于检查您的代码是否存在数据竞争安全性。数据竞争安全错误的数量反映了编译器检测到的与这些并发或数据竞争检查相关的问题的数量。总错误图表绘制了所有软件包中这些错误的总和。
问:与确定软件包页面上 Swift 版本兼容性的“标准”Swift Package Index 构建相比,这些测试是否添加了额外的参数到构建命令中?
答:是的。这些图表绘制了软件包的状态,就好像每个软件包都选择了 Swift 6 语言模式并启用了“完整”并发检查一样。我们传递 -strict-concurrency=complete
给 swift build
或 xcodebuild
以实现此目的,方法是在编译器中启用所有数据竞争安全检查。
问:显示零数据竞争编译器诊断的软件包是否保证免受数据竞争错误的影响?
答:否。我们从启用了“完整”并发检查的 Swift 编译器诊断中收集数据竞争安全数据。我们无法判断诊断产生零错误是因为真正缺乏数据竞争安全错误,还是由于使用 @unchecked Sendable
等技术抑制了错误。
问:为什么使用 -strict-concurrency=complete
而不是 -swift-version 6
?
答:数据竞争安全诊断是在编译器的不同阶段确定的。例如,类型检查会产生一些数据竞争安全错误,而另一些则在代码生成后的控制流分析期间诊断出来。如果类型检查产生错误,编译器将不会继续进行代码生成,因此使用 -swift-version 6
进行测试将显示比软件包生态系统中实际存在的错误更少的错误。
问:“所有软件包”数据集包含哪些软件包?
答:我们没有测试索引中的每个软件包。相反,我们正在测试正在进行某种积极开发的软件包。对于此测试,我们将图表中的“所有软件包”定义为在过去一年中至少向其存储库提交过一次提交的任何软件包。我们在 2024 年 3 月 19 日拍摄了活跃软件包的快照,“所有软件包”数据集包括 3,395 个软件包。该数据集还不包括 3 月 19 日之后添加的任何新软件包。
问:“Apple 软件包”和“SSWG 孵化软件包”数据集包含哪些软件包?
答:除了整体兼容性之外,查看一些精选软件包列表的切片也很有趣。Apple 应该走在前列,因此“Apple 软件包”数据集是Apple 编写的所有软件包,同样应用上述相同标准。不包括 3 月 19 日之后的新软件包,也不包括过去一年中没有提交的软件包。SSWG 孵化数据集的想法相同,但来源于Swift 服务器工作组孵化软件包列表。