Swift 5.8 发布!
Swift 5.8 现已正式发布!🎉 此版本包括对 语言和标准库 的重大新增功能,包括 hasFeature 以支持逐步采用即将推出的功能,改进的 开发者体验,Swift 生态系统中工具的改进,包括 Swift-DocC、Swift Package Manager 和 SwiftSyntax,完善的 Windows 支持 等。
感谢 Swift 社区中使此版本成为可能的所有人。非常感谢您在 Swift 论坛上的讨论、错误报告、pull request、教育内容和其他贡献!
要快速了解 Swift 5.8 中的一些新功能,请查看 Paul Hudson 整理的 playground。
《Swift 编程语言》 书籍已针对 Swift 5.8 进行了更新,现在以 DocC 发布。这是官方 Swift 指南,对于 Swift 新手来说是一个很好的入门点。Swift 社区还维护了许多翻译版本。
语言和标准库
Swift 5.8 使您能够通过使用即将推出的功能,开始逐步为 Swift 6 准备您的项目。默认情况下,即将推出的功能处于禁用状态。要启用某项功能,请传递编译器标志 -enable-upcoming-feature,后跟该功能的标识符。
功能标识符也可以使用 #if hasFeature(FeatureIdentifier) 在源代码中使用,以便代码仍然可以在较旧的工具(即将推出的功能不可用)中编译。
Swift 5.8 包含以下 Swift 演进提案的即将推出的功能
- SE-0274: 简洁的魔法文件名 (
ConciseMagicFile) - SE-0286: 尾随闭包的前向扫描匹配 (
ForwardTrailingClosures) - SE-0335: 引入存在类型 any (
ExistentialAny) - SE-0354: 正则表达式字面量 (
BareSlashRegexLiterals)
例如,使用 -enable-experimental-feature ConciseMagicFile 在名为 MagicFile 的模块中构建 /Users/example/Desktop/0274-magic-file.swift 的以下文件,将选择加入 SE-0274 中描述的 #file 和 #filePath 的简洁格式
print(#file)
print(#filePath)
fatalError("Something bad happened!")
上面的代码将产生以下输出
MagicFile/0274-magic-file.swift
/Users/example/Desktop/0274-magic-file.swift
Fatal error: Something bad happened!: file MagicFile/0274-magic-file.swift, line 3
Swift 5.8 还包括条件属性,以降低支持多个 Swift 工具版本的库的维护成本。#if 检查现在可以围绕声明上的属性,并且新的 hasAttribute(AttributeName) 条件指令可用于检查编译器版本是否支持当前语言模式下具有名称 AttributeName 的属性
#if hasAttribute(preconcurrency)
@preconcurrency
#endif
protocol P: Sendable { ... }
Swift 5.8 带来了其他语言和标准库增强功能,包括 为可选参数的 any 参数取消装箱、result builder 中的本地包装属性、改进的 key path 的调试打印等等。
您可以在下面的Swift 演进附录中找到 Swift 5.8 中实现的 Swift 演进提案的完整列表。
开发者体验
改进的 Result Builder 实现
Swift 5.8 中重新设计了 result builder 的实现,以大幅提高编译时性能、代码补全结果和诊断。Swift 5.8 result builder 的实现强制执行更严格的类型推断,这与 SE-0289: Result Builders 中的语义相匹配,这对某些依赖无效类型推断的现有代码产生了影响。
新的实现利用了 Swift 5.7 中引入的 扩展的多语句闭包推断,并完全按照 result builder 提案的规定应用 result builder 转换 - 源级别转换,其类型检查方式类似于多语句闭包。这样做使编译器能够充分利用改进的闭包推断为 result builder 转换的代码带来的所有好处,包括优化的类型检查性能(尤其是在无效代码中)和改进的错误消息。
有关更多详细信息,请参阅 Swift 论坛帖子,其中概述了改进并提供了有关无效推断场景的更多信息。
生态系统
Swift-DocC
正如 2 月份宣布的,《Swift 编程语言》书籍已转换为 Swift-DocC 并开源,随之而来的是 Swift-DocC 本身的一些增强功能,即 option 指令,您可以使用这些指令来更改生成的文档的行为。Swift-DocC 还添加了一些新的指令,以创建更具动态的文档页面,包括基于网格的布局和 tab 导航器。
为了更进一步,您现在可以使用颜色、字体和图标自定义自定义文档页面的外观。导航也向前迈进了一步,实现了快速导航,允许项目内模糊搜索

Swift-DocC 现在还支持记录来自其他模块的类型的扩展。这是一个选择加入的功能,可以通过在使用 Swift-DocC 插件时添加 --include-extended-types 标志来启用。

Swift Package Manager
以下是 Swift 5.8 中引入的 Swift Package Manager 更改的一些亮点
-
SE-0362:目标现在可以指定它们需要的即将推出的语言功能。
Package.swift清单语法已扩展了 API,以包含在目标级别设置enableUpcomingFeature和enableExperimentalFeature标志。 -
SE-0378:现在支持与软件包注册表交互时的令牌身份验证。
swift package-registry命令有两个新的子命令login和logout,用于添加/删除注册表凭据。 -
现在允许公开仅由工件包支持的二进制目标组成的可执行产品。这允许销售二进制可执行文件作为其自己的独立软件包,独立于使用它们的插件。
-
在使用工具版本 5.8 或更高版本的软件包中,Foundation 不再隐式导入到软件包清单中。如果使用了 Foundation API,则需要显式导入模块。
请参阅 Swift Package Manager changelog 以获取完整的更改列表。
SwiftSyntax
随着与 Swift 5.8 对齐的 SwiftSyntax 版本的发布,SwiftSyntax 包含一个完全重写的解析器,该解析器完全用 Swift 实现,而不是依赖 C++ 解析器来生成 SwiftSyntax 树。虽然 Swift 编译器仍然使用用 C++ 实现的旧解析器,但最终目标是完全替换旧解析器。新解析器具有许多优点
- 为 SwiftSyntax 做出贡献或依赖于 SwiftSyntax 现在与任何其他 Swift 软件包一样容易。这大大降低了新贡献者和采用者的入门门槛。
- 新解析器的设计主要目标是错误恢复。它对解析错误更加宽容,并产生更好的错误消息。
- SwiftSyntaxBuilder 允许使用 result builder 和字符串插值的混合以声明方式生成源代码。可以在此处找到一个示例。
Windows 平台
Swift 5.8 继续逐步改进 Windows 工具链。此版本周期中完成的一些重要工作包括
- Windows 工具链减少了对环境变量的一些依赖。
DEVELOPER_DIR以前是定位组件所必需的,现在不再需要。这清理了安装,使我们能够更接近按用户安装。 - ICU 已更改为静态链接。这减少了需要分发的文件数量,并减少了发货产品所需的依赖项数量。通过删除 Swift 标准库中的 ICU 依赖项,这成为可能。
- 一些支持 Windows 上 C++ 互操作性的初始工作已合并并可在工具链中使用。这包括 Microsoft C++ 运行时 (msvcprt) 模块化的工作。
vcruntime模块已重命名为visualc。这更好地反映了模块,并为将来增强 Windows 平台库的桥接铺平了道路。- Swift Package Manager 中改进路径处理的大量工作已合并。这应该有助于使 Swift Package Manager 在 Windows 上更健壮,并改进与 SourceKit-LSP 的交互。
- SourceKit-LSP 从多项鲁棒性改进中受益。跨模块引用现在更加可靠,并且由于 SwiftPM 中增强的路径处理,C/C++ 引用得到了改进,这确保了文件被正确识别。
下载
官方二进制文件可从 的下载页面下载,适用于 Xcode、Windows 和 Linux。Swift 5.8 编译器也包含在 Xcode 14.3 中。
Swift 演进附录
以下语言、标准库和 Swift Package Manager 提案已通过 Swift 演进 流程并在 Swift 5.8 中实现。
语言和标准库
- SE-0274: 简洁的魔法文件名
- SE-0362: 逐步采用即将推出的语言改进
- SE-0365: 在 self 解包后,允许弱 self 捕获的隐式 self
- SE-0367: 属性的条件编译
- SE-0368: StaticBigInt
- SE-0369: 为 AnyKeyPath 添加 CustomDebugStringConvertible 一致性
- SE-0370: 指针族初始化改进和更好的缓冲区切片
- SE-0372: 将文档排序记录为稳定排序
- SE-0373: 取消 result builder 中变量的所有限制
- SE-0375: 打开存在类型参数以用于可选参数
- SE-0376: 函数反向部署
Swift Package Manager
- SE-0362: 逐步采用即将推出的语言改进
- SE-0378: 软件包注册表身份验证