Swift 5.3 发布!

Swift 5.3 现在正式发布了!🎉

Swift 5.3 继续专注于语言改进、开发者体验以及扩展 Swift 生态系统,从而为编写 Swift 代码创造更多机会。这些由 Amy Tsai 创建的草图笔记,展示了 Swift 5.3 版本的亮点

Sketch notes of What's New in Swift 5.3

完整分辨率版本可在 Amy 的推文 上查看

您还可以通过 playground 体验许多这些更新,该 playground 由 Paul Hudson 整理。

语言和标准库

新特性和改进

Swift 5.3 带来了许多语言改进,提升了编写 Swift 代码的人机工程学。这些更新可以帮助您成为更高效的 Swift 程序员,方法是减少样板代码和冗余代码,并使更多功能能够在您可能使用的库中定义。

Swift 5.3 实现了来自 Swift Evolution 流程的以下提案

这些特性中的许多特性是由活跃的社区成员提出和实现的:Dianna MaAnthony LatsisSuyash SrijanFrederick Kellison-LinnOwen Voorhees。感谢你们的贡献!

Swift 5.3 还包括对几个常见编译器限制的修复

运行时性能改进

Swift 5.3 显著改进了二进制代码大小和运行时内存使用量。这些改进的测量结果在各个项目中都取得了令人兴奋的成果

这些测量结果在 WWDC 2020 的 ‘What’s New in Swift’ 演讲中报告。

二进制大小的改进将因使用模式而异。最大的改进在于声明了大量类型的项目,这是通过减小“值函数”(编译器生成的用于创建、复制和销毁值类型的不可见函数)的大小来实现的。这对于 SwiftUI 应用程序尤其有利。

此外,Swift 应用程序现在在运行时具有更低的堆内存开销。由于运行时改进使得这种缓存变得不那么必要,Swift 运行时在启动时缓存的信息更少,以跟踪协议一致性等内容。使用 Swift 编写的应用程序现在应该比使用 Objective-C 编写的相同程序使用更少的堆内存。

开发者体验

编辑代码时的缩进改进

SourceKit 中的自动缩进实现已在此版本中进行了全面修订,修复了过程中的约 50 个反馈报告。特别是,在此版本中,以下情况的自动缩进得到了极大改进

代码补全

Swift 5.3 进一步提高了代码补全的性能和质量

构建时间改进

Swift 5.3 采用了一种新的策略,用于编译器处理 Swift 代码中的声明。这些更改带来了以下几项具体改进

这些改进是通过在编译器中扩展采用新的集中式框架来实现的,该框架记录细粒度的依赖关系信息,缓存可能需要重复的昂贵计算的结果,并自动检测 Swift 代码中的依赖循环。

编译器诊断

Swift 5.3 在 Swift 5.2 的诊断改进的基础上,进一步增强了错误消息的质量和精度,尤其是在 SwiftUI 代码中。更具体地说,向 新诊断架构 的过渡现在在 Swift 5.3 中完成!

5.3 中的许多诊断改进都涉及复杂的泛型代码,其中泛型参数具有失败的要求,例如缺少一致性。例如,考虑以下代码

struct FormList<FieldID> {
  init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
                                             FieldID == Data.Element.ID { ... }
}

struct Field {
  let id: String
}

func createForm(fields: [Field]) {
  let form = FormList(fields)
}

在 Swift 5.2 中,此编译器报告了一个非常难以理解的错误消息

error: expression type 'FormList<_>' is ambiguous without more context
  let form = FormList(fields)
             ^~~~~~~~~~~~~~~~

在 Swift 5.3 中,编译器正确报告了缺少的一致性,并提供了一个有用的注释,显示了需求的来源

error: initializer 'init(_:)' requires that 'Field' conform to 'Identifiable'
  let form = FormList(fields)
             ^

note: where 'Data.Element' = 'Field'
  init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
  ^

调试

Swift 5.3 支持为运行时故障提供更好的错误消息。当调试信息可用时,调试器现在将显示标准库中陷阱的原因,而不仅仅是显示不透明的无效指令崩溃。

当调试在不同机器上编译的二进制文件时,LLDB 现在更加健壮

生态系统

Swift Package Manager

资源 (SE-0271)

包现在可以包含运行时需要的资源,例如图像和其他数据文件。资源按目标范围划分,并在构建包时进行处理并嵌入到客户端应用程序中。可以使用 Foundation 的 Bundle API 从源代码访问资源。

特定于 Apple 平台的资源(例如资产目录、情节提要和 CoreData 模型)只能在 Xcode 中构建,但所有平台都支持通用资源。包清单中的新 API 提供了对将哪些源文件视为资源的控制。

本地化 (SE-0278)

包现在可以包含可本地化的内容,例如 .strings 文件和资源的本地化变体。可以使用 .lproj 目录将可本地化的内容添加到包中,并且可以使用 Foundation API 访问这些内容。

二进制依赖项 (SE-0272)

软件包现在可以发布预构建的库(以 XCFrameworks 的形式分发),从而允许依赖于无法以源代码形式分发的库。此功能目前仅在为 Apple 平台构建时可用。软件包清单中的新 API 允许将 XCFrameworks 引用为二进制目标。

有条件的目标依赖项 (SE-0273)

现在可以将软件包目标的依赖项声明为有条件的,这可以用于按平台限制依赖项。这为描述支持多平台的复杂目标依赖项提供了更大的灵活性。

请注意,基于构建配置的条件也是 Swift 演进提案的一部分,但尚未实现,因此不属于 Swift 5.3 的一部分。

下载

官方二进制文件可从 下载,作为与 Xcode 配合使用的工具链,以及 Linux 工具链和 Docker 镜像。Swift 5.3 也包含在 Xcode 12 中。适用于 Windows 的官方工具链将在未来几周内推出。

源代码

Swift 5.3 的开发在以下仓库的 `release/5.3` 分支中进行跟踪

标记 `swift-5.3-RELEASE` 指定了构成 Swift 5.3 最终版本的这些仓库中的特定修订版本。

`release/5.3` 分支将保持开放,但在相同的发布管理流程下,以累积下一次发布的更改。