Swift 5.8 发布!

Swift 5.8 现已正式发布!🎉 此版本包括对 语言和标准库 的重大新增功能,包括 hasFeature 以支持逐步采用即将推出的功能,改进的 开发者体验,Swift 生态系统中工具的改进,包括 Swift-DocCSwift Package ManagerSwiftSyntax,完善的 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 演进提案的即将推出的功能

例如,使用 -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 导航器

为了更进一步,您现在可以使用颜色、字体和图标自定义自定义文档页面的外观。导航也向前迈进了一步,实现了快速导航,允许项目内模糊搜索

A DocC documentation page showing a quick navigation overlay showing fuzzy documentation search

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

A documentation page featuring an extension to the standard library's Collection type.

Swift Package Manager

以下是 Swift 5.8 中引入的 Swift Package Manager 更改的一些亮点

请参阅 Swift Package Manager changelog 以获取完整的更改列表。

SwiftSyntax

随着与 Swift 5.8 对齐的 SwiftSyntax 版本的发布,SwiftSyntax 包含一个完全重写的解析器,该解析器完全用 Swift 实现,而不是依赖 C++ 解析器来生成 SwiftSyntax 树。虽然 Swift 编译器仍然使用用 C++ 实现的旧解析器,但最终目标是完全替换旧解析器。新解析器具有许多优点

Windows 平台

Swift 5.8 继续逐步改进 Windows 工具链。此版本周期中完成的一些重要工作包括

下载

官方二进制文件可从 下载页面下载,适用于 Xcode、Windows 和 Linux。Swift 5.8 编译器也包含在 Xcode 14.3 中。

Swift 演进附录

以下语言、标准库和 Swift Package Manager 提案已通过 Swift 演进 流程并在 Swift 5.8 中实现

语言和标准库

Swift Package Manager