Swift 6 发布

  Swift 6 已经发布,该版本带来了语言和标准库的增强、改进的调试工具、跨平台库的扩展以及对嵌入式开发和生产力工具的支持。

  Swift 6 的发布为 Swift 语言带来了显著的进步,包括对并发、类型化异常抛出、所有权、C++ 互操作性、嵌入式 Swift 以及 128 位整数的支持和改进。它引入了新的同步库、类型化抛出机制、对不可复制类型的支持以及对嵌入式开发的初步支持。

  此外,Swift 6 还增强了对 C++ 的互操作性,统一了 Foundation 在所有平台上的实现,并推出了全新的 Swift Testing 库。该版本还提供了对 Linux 和 Windows 平台的全面支持,包括对更多 Linux 发行版和 Windows 架构的支持,以及为 Linux 提供了全静态 SDK。Swift 6 还致力于提高生产效率,通过引入新的生产力增强功能和改进的调试宏,使得开发者能够更高效地编写和调试代码。

  几个亮点:

  并发安全

  Swift 长期以来一直提供内存安全性,确保变量在使用前初始化,内存在释放后不会被访问,并且会检查数组索引是否存在越界错误。Swift 6 现在包含一种新的可选语言模式,该模式扩展了 Swift 的安全保证,通过将代码中潜在的数据争用诊断为编译器错误来防止并发代码中的数据争用。

  数据竞争安全检查以前在 Swift 5.10 中通过编译器标志 -strict-concurrency=complete 以警告形式提供。得益于改进的推理和用于将可变状态从一个参与者转移到另一个参与者的新编译器分析,Swift 6 关于数据竞争安全的警告误报更少。

  Swift 6 标志着数据竞争安全性的起步,该旅程将大大简化。Swift 6 还附带了一个用于低级并发 API 的新同步库,包括原子操作和新的互斥 API。

  类型化异常抛出

  Swift 6 允许函数在其签名中指定其抛出的错误类型。此功能在转发客户端代码中抛出的错误时,或在无法分配内存的资源受限环境中(例如嵌入式 Swift 代码)非常有用。

  例如:

func parseRecord (from string: String) throws (ParseError) -> Record { 
  // ... 
}

  调用 parseRecord (from:) 将返回一个 Record 实例或抛出一个 ParseError 类型的错误。do..catch 块将推断变量 ParseError 的 error 类型:

do {
  let record = try parseRecord (from: myString)
} catch {
  // 'error' has type 'ParseError'
}

  C++ 互操作性

  Swift 5.9 引入了与 C++ 的双向互操作性,将 Swift 无缝引入更多现有项目。Swift 6 将互操作性支持扩展到 C++ 仅移动类型、虚拟方法、默认参数以及更多标准库类型包括 std::map 和 std::optional

  嵌入式 Swift

  Swift 6 包含 Embedded Swift 的实验性预览版,这是一种语言子集和编译模式,适用于嵌入式软件开发,例如编程微控制器。该工具链支持 ARM 和 RISC-V 裸机目标。

  Embedded Swift 依靠通用特化生成小型独立二进制文件。由于它不依赖于运行时或类型元数据,因此 Embedded Swift 适用于内存限制严格的平台以及运行时依赖性有限的低级环境。

  嵌入式 Swift 仍然是一个实验性功能,在未来的 Swift 版本中提供稳定支持之前仍需持续开发。

  Swift 6 提供了统一的 Foundation 实现,确保了跨平台的一致性和可靠性,并且为 Linux 和 Windows 平台提供了全面的支持。

  Swift 6 在所有平台上统一了 Foundation 的实现。现代、可移植的 Swift 实现提供了跨平台的一致性,更加稳健,并且是开源的。macOS 和 iOS 从 Swift 5.9 开始使用 Swift 实现的 Foundation,而 Swift 6 将这些改进带到了 Linux 和 Windows。

  像 JSONDecoder、URL、Calendar、FileManager、ProcessInfo 等核心类型已经在 Swift 中完全重新实现。这些类型与 macOS 15 和 iOS 18 分享其实现,提供了一种新的跨平台一致性、可靠性和性能水平。最近发布的 API,如 FormatStyle、ParseStrategy、Predicate 和 JSON5,从过去的 macOS 和 iOS 发布中,现在在所有 Swift 平台上都可以使用。新的 Foundation API,如 Expression、日历枚举改进、日历重复规则、格式样式增强等,同时在 macOS、iOS、Linux 和 Windows 上可用 —— 并且它们是在社区参与下构建的。

  Swift 6 推出了 Swift Testing 库,这是一个专为 Swift 设计的全新测试框架,它提供了丰富的 API 和宏支持,使得编写和组织测试变得更加容易。

  Swift 6 引入了 Swift Testing,这是一个从零开始为 Swift 设计的新测试库。它包含了富有表现力的 API,使编写和组织测试变得简单。当测试失败时,它使用像 #expect 这样的宏提供详细的输出。此外,它还具备参数化等功能,能够轻松地在大型代码库中以不同参数重复执行测试。

  例如:

@Test ("Continents mentioned in videos", arguments: [
  "A Beach",
  "By the Lake",
  "Camping in the Woods"
])
func mentionedContinents (videoName: String) async throws {
  let videoLibrary = try await VideoLibrary ()
  let video = try #require (await videoLibrary.video (named: videoName))
  #expect (video.mentionedContinents.count <= 3)
}

  Swift 6 对调试工具进行了改进,包括引入了新的调试宏,以及提高了 LLDB 调试器的启动性能。

  Swift 6 提供了一种新的调试宏,可以轻松自定义在使用 p 命令时对象在 LLDB 中的显示方式,以及在 Xcode 和 VSCode 的变量视图中,采用一种不运行任意代码的格式方案。符合 CustomDebugStringConvertible 协议的类型提供了一个 debugDescription 属性,该属性返回描述对象的字符串。在 LLDB 中,po 命令调用该计算属性。相比之下,p 命令使用 LLDB 的类型摘要格式化程序直接根据其存储属性值来格式化对象。

  @DebugDescription 是标准库中的一个新宏,它允许开发者直接在代码中为自己的类型指定 LLDB 类型摘要。该宏处理 debugDescription 属性,将涉及存储属性的简单字符串插值转换为 LLDB 类型摘要。这使得即使在使用 p 时,LLDB 也能使用您的自定义格式,并且可以在 Xcode 或 VSCode 的变量显示窗口中使用。该宏可以利用现有的 CustomDebugStringConvertible 符合性,也可以仅为 LLDB 的 p 命令提供单独的字符串插值。

  平台支持

  Swift 6 全面为 Linux 和 Windows 带来了重大改进,包括支持更多 Linux 发行版和 Windows 架构。

  Swift 6 支持为 Linux 构建完全静态链接的可执行文件;这些文件没有外部依赖项,因此非常适合想要将程序直接复制到系统或容器中并运行它而无需安装任何额外软件的情况。该 SDK 还可用于从其他平台交叉编译到 Linux。

  Swift 6 增加了对 Debian 和 Fedora 以及 Ubuntu 24.04 的官方支持和测试。Windows 构建性能方面,预构建的工具链现已适用于 arm64 架构,这为 ARM 主机上的 Windows 提供了改进的编译器性能。在 Swift 6 中,Swift 包管理器还默认在 Windows 上的多个核心上并行构建。在 10 核机器上,可以将构建性能提高多达 10 倍。

  下载地址:Swift.org/install

  更多信息查看官方公告:https://www.swift.org/blog/announcing-swift-6