Swift 6.1 已发布

Swift 6.1 现已发布!

此版本包括新的语言增强功能,以提高生产力、改进诊断、包特性,以及持续改进数据竞争安全可用性和编译时间的工作。

请继续阅读以了解语言、包管理器更改的概述,以及开始使用 Swift 6.1 的后续步骤。

语言和标准库

并发性

Swift 的并发模型允许在属性和函数上编写 nonisolated,以表明 API 可以安全地从任何并发上下文调用。Swift 6.1 将 nonisolated 扩展到类型和扩展。这允许您编写 nonisolated 以防止对类型进行 @MainActor 推断,或将 nonisolated 应用于扩展中的所有方法,而无需注释每个方法

@MainActor
struct S {
  let id: Int
  let name: String

  // mutable state and MainActor methods
}

nonisolated extension S: CustomStringConvertible, Equatable {
  var description: String {
    "id: \(id), name: \(name)"
  }

  static func ==(lhs: S, rhs: S) -> Bool {
    lhs.id == rhs.id
  }
}

Swift 6.1 还改进了任务组的类型推断,通过推断 withTaskGroupwithThrowingTaskGroup 的子任务结果类型。以前,在创建任务组时,您总是必须将子任务结果类型写为参数

let messages = await withTaskGroup(of: Message.self) { group in
  for id in ids {
    group.addTask { await downloadMessage(for: id) }
  }

  var messages: [Message] = []
  for await message in group {
    messages.append(message)
  }
  return messages
}

在 Swift 6.1 中,子任务结果类型可以从任务组闭包中推断出来

// No need for `(of: Message.self)` like before.
let messages = await withTaskGroup { group in
  for id in ids {
    group.addTask { await downloadMessage(for: id) }
  }

  var messages: [Message] = []
  for await message in group {
    messages.append(message)
  }
  return messages
}

数据竞争安全的可访问性仍然是积极开发的领域;您可以在改进数据竞争安全可访问性的愿景文档中找到该方法的概述。许多 Swift Evolution 提案正在积极审查中,这些提案实现了愿景文档中描述的功能,您的反馈将有助于塑造这些改进。

在 Swift 中实现 Objective-C 类型

Swift 6.1 包括一个新的属性 @implementation,它可以与 @objc 一起使用,为从 Objective-C 导入的声明提供实现。您可以在 Swift extension 上编写 @objc @implementation,以替换 Objective-C @implementation 块。

您可以像往常一样为 Objective-C 类编写头文件,但是您可以在 Swift 文件中编写 @objc @implementation extension,而不是在 Objective-C 文件中编写 @implementation。您甚至可以一次将现有类的实现移植到一个类别,而不会破坏向后兼容性。

生产力增强

Swift 允许在集合字面量中包含尾随逗号,以便轻松地像任何其他元素一样添加、删除、重新排序或注释掉最后一个元素

let rank = [
  "Player 1",
  "Player 3",
  "Player 2",
]

Swift 6.1 将尾随逗号支持扩展到元组、参数和参数列表、泛型参数列表、闭包捕获列表和字符串插值

let numbers = [1, 2, 0, 3, 4, 0, 0, 5]

let subsequences = numbers.split(
    separator: 0,
    maxSplits: 1,
)

除了改进的开发人体工程学之外,代码生成工具(如插件和宏)也可以得到简化,因为生成逗号分隔的列表不再需要最后一个元素的特殊条件。

您可以在 Swift Evolution 仪表板上找到通过 Swift Evolution 流程接受并在 Swift 6 中实现的语言提案的完整列表。

包和构建改进

Swift 6.1 引入了包特性,这是一种新的包配置,允许包在特定环境(例如 Embedded Swift 和 WebAssembly)中使用时提供不同的 API 和功能。包作者可以在他们的 Package.swift 中定义其包提供的一组特性,这些特性提供了一种表达条件编译和可选依赖项的方法。包可以指定一组在客户端中启用的默认特性,客户端可以在声明依赖项时自定义他们使用的特性

dependencies: [
  .package(
    url: "https://github.com/Org/SomePackage.git",
    from: "1.0.0",
    traits: [
      .default, // enable all of the package's default traits
      "Embedded"
    ]
  ),
]

许多编辑功能(例如跳转到您正在使用的库中 API 的定义)都由索引提供支持。在 Swift 6.1 之前,索引发生在您构建项目时,这意味着库的任何添加或更改只有在您执行构建后才会被这些编辑功能显示出来。Swift 6.1 默认在 SourceKit-LSP 中为 SwiftPM 项目启用后台索引。跨模块和全局功能会随着您对项目进行更改而保持更新。

Swift 测试

Swift 6.1 启用自定义 Swift Testing 特性,以在测试运行之前或之后执行逻辑,以便共享设置或拆卸逻辑。如果您编写的自定义特性类型符合新的 TestScoping 协议,则可以实现一种方法来自定义应用该特性的每个测试或套件将在其中执行的范围。例如,您可以实现一个将任务局部值绑定到模拟资源的特性

struct MockAPICredentialsTrait: TestTrait, TestScoping {
  func provideScope(for test: Test, testCase: Test.Case?, performing function: @Sendable () async throws -> Void) async throws {
    let mockCredentials = APICredentials(apiKey: "fake")
    try await APICredentials.$current.withValue(mockCredentials) {
      try await function()
    }
  }
}

extension Trait where Self == MockAPICredentialsTrait {
  static var mockAPICredentials: Self { Self() }
}

@Test(.mockAPICredentials)
func example() {
  // Validate API usage, referencing `APICredentials.current`...
}

有关更多详细信息,请参阅ST-0007:测试范围特性。Swift 6.1 中的 Swift Testing 还包括 #expect(throws:)#require(throws:) 宏的改进版本,这些宏返回其捕获的错误,从而使在测试函数中检查它们更加符合人体工程学 (ST-0006)。

Swift-DocC

Swift-DocC 引入了一种更易于人类阅读和编写的人性化替代方案,用于基于参数类型和返回类型信息的符号链接消歧。例如,考虑以下三个具有不同参数类型和返回类型的函数重载

func doSomething(first: String,  second: Int) -> Double
func doSomething(first: String?, second: Int) -> Float
func doSomething(first: String?, second: Int) -> Double

以前,如果您编写指向其中一个重载的链接,则需要包含该符号唯一标识符的短哈希值,以消除链接的歧义并唯一引用特定的重载。Swift-DocC 的警告有助于编写这些哈希值,但是人们无法解码生成的哈希后缀 (-3c5j) 来确定链接引用的是哪个重载。现在,您可以使用参数类型和返回类型的组合(例如 -(String,_)->Float,-(String?,_)->Double)来消除链接的歧义并唯一引用特定的重载。

您可以从 Swift-DocC 关于模糊符号链接的警告中发现每个重载的参数类型和返回类型的最小组合。有关更多详细信息,请参阅链接到符号和其他内容的模糊符号链接部分

安装 Swift 6.1

您今天就可以试用 Swift 6.1 中这些令人兴奋的新开发成果!

如果您正在为 Apple 平台构建应用程序,则 Xcode 16.3 中包含了 Swift 6.1,现在可以从 App Store 下载。安装独立 Swift 6.1 工具链的最简单方法是使用 swiftly,这是一款可在 macOS 和 Linux 上运行的新 Swift 版本管理器。其他安装方法(包括 Windows)包含在安装 Swift页面上。