Swift 5.6 发布!

Swift 5.6 现已正式发布!

感谢 Swift 社区的每一位成员,感谢你们的讨论、提案、错误报告、Pull Request 以及更多贡献。

Swift 5.6 包括对类型系统的一些增强,改进了与指针的交互,并增加了使用包管理器运行新插件命令的功能。

想快速了解 Swift 5.6 的一些新特性,请查看 Paul Hudson 整理的这个 playground

如果您是 Swift 新手,《Swift 编程语言》是 Swift 编程语言的权威指南,并且已针对 5.6 版本进行了更新。Swift 社区还维护了许多译本。您也可以在 Apple Books 商店 免费获取。

语言和标准库

新特性和改进

Swift 5.6 通过 Swift 演化 过程中的多项提案增强了语言功能,包括

让我们更详细地了解一下其中的一些内容。

类型系统的增强功能

类型占位符 (SE-0315)

Swift 允许您使用类型推断来省略代码中冗长、偶然的细节。但是,在需要时编写显式类型可能会让人感到繁琐,因为您必须指定完整的类型,即使您的代码只需要类型的特定部分来提供清晰度

enum Either<Left, Right> {
  case left(Left)
  case right(Right)
}

let either: Either<ClosedRange<Int>, Range<Int>> = .left(0...10)

使用类型占位符,您现在可以在代码中编写部分类型注解,仅提供必要的细节。类型占位符用 _ 表示,它指示编译器推断缺失的类型

enum Either<Left, Right> {
  case left(Left)
  case right(Right)
}

// Inferred as 'Either<ClosedRange<Int>, Range<Int>>'
let either: Either<_, Range<Int>> = .left(0...10)

存在类型 any (SE-0335)

Swift 中的存在类型用于存储符合特定协议的任何类型的值。如今,存在类型使用普通的协议名称或协议组合来表示

protocol DataSourceObserver { ... }

struct DataSource {
  var observers: [DataSourceObserver] { ... }
}

存在类型会擦除其底层类型信息,这在您需要动态更改底层类型时很有用,但这也阻止了存在类型具备其他有用的功能,例如符合协议。现有的语法令人困惑,因为存在类型看起来就像泛型一致性要求,而泛型一致性要求没有这些基本限制。

在 Swift 5.6 中,可以使用 any 关键字显式标记存在类型

protocol DataSourceObserver { ... }

struct DataSource {
  var observers: [any DataSourceObserver] { ... }
}

改进的指针交互

Swift 5.6 在使用不安全指针时引入了三项重大改进

临时未初始化缓冲区 (SE-0322)

这引入了一种创建临时未初始化内存空间的新方法,这在与需要提供内存以存储计算结果的 C API 交互时特别有用。

放宽 C 函数指针参数的诊断 (SE-0324)

此更改允许将不安全指针的可变变体(例如 UnsafeMutablePointer)传递给接受不可变版本(例如 UnsafePointer)的 API,而无需显式转换。

从不安全指针类型中移除 Sendable 一致性 (SE-0331)

来自早期 Sendable 采用的反馈表明,指针一致性具有意想不到的负面影响,特别是对于隐式一致性,因为这些类型表现得像引用。

改进的并发安全模型

Swift 5.6 还包括对并发安全模型的几项改进

渐进式迁移到并发检查 (SE-0337)

关于 Sendable 的诊断在 Swift 5.6 中默认被抑制,但可以通过显式定义对 Sendable 的一致性或使用 -warn-concurrency 编译器标志来启用,从而实现向并发检查的渐进式迁移路径。

生态系统

Swift 包管理器

Swift 包管理器在 Swift 5.6 中获得了可扩展性功能,以及一些重要的安全性、性能和可靠性更新。

可扩展的构建工具 (SE-0303)

引入了在 SwiftPM 中定义构建工具插件的能力,允许在构建期间自动调用自定义工具。构建工具插件专注于在软件包构建期间进行代码生成,例如从 .proto 文件或其他输入生成 Swift 源文件,以便将构建工具纳入构建图并在安全的方式下自动运行。

命令插件 (SE-0332)

扩展了 SE-0303 首次引入的 SwiftPM 插件支持,以允许自定义命令插件的定义——用户可以直接从 SwiftPM CLI 或支持 Swift Package 的 IDE 中调用这些插件,以便对其软件包执行自定义操作。命令插件指定命令的语义意图——这可能是预定义的意图之一,例如“文档生成”或“源代码格式化”,或者它可能是具有可以传递给 swift package 命令的专用动词的自定义意图。

其他更新包括

Swift-DocC 更新

Swift-DocC 现在可以作为 SwiftPM 插件使用,利用新的插件命令支持。请参阅文档以了解如何开始使用

此外,您现在可以使用 Swift-DocC 将静态内容发布到 GitHub Pages

其他增强功能包括

请务必查看 Joseph Heck 的精彩博客文章,其中更详细地介绍了这一点。

下载

官方二进制文件可从 下载,适用于 Xcode、Windows 和 Linux。Swift 5.6 也包含在 Xcode 13.3 中。

我们还为 Amazon Linux 2 和 CentOS 7 提供 RPM,仅供实验使用。请提供您的反馈

请使用以下说明进行 RPM 安装

Amazon Linux 2

$ curl https://download.swift.org/experimental-use-only/repo/amazonlinux/releases/2/swiftlang.repo > /etc/yum.repos.d/swiftlang.repo
$ amazon-linux-extras install epel
$ yum install swiftlang

CentOS 7

$ curl https://download.swift.org/experimental-use-only/repo/centos/releases/7/swiftlang.repo > /etc/yum.repos.d/swiftlang.repo
$ yum install epel-release
$ yum install swiftlang