Swift 6.2 正式发布

我们非常高兴地宣布 Swift 6.2 正式发布,该版本旨在提高每一位 Swift 开发人员的工作效率,无论您在何处或以何种方式编写代码。从工具和库的改进到并发性和性能的增强,Swift 6.2 为软件栈各层的实际开发提供了广泛的功能。

   swift/编程语言 | 

我们非常高兴地宣布 Swift 6.2 正式发布,该版本旨在提高每一位 Swift 开发人员的工作效率,无论您在何处或以何种方式编写代码。从工具和库的改进到并发性和性能的增强,Swift 6.2 为软件栈各层的实际开发提供了广泛的功能。

请继续阅读,深入了解语言、库、工作流、平台支持的变化,以及开始使用 Swift 6.2 的下一步。

平易近人的并发性

Swift 6.2 通过一系列变化降低了并发编程的门槛,这些变化旨在减少模板,让您更自然地编写安全的并发代码:

  • 默认情况下使用单线程: 使用默认情况下将代码隔离到主线程的新选项,在主线程上运行代码,而无需显式的 @MainActor 注解。该选项非常适合脚本、用户界面代码和其他可执行目标。
  • 直观的 async 函数: 编写异步代码时无需并发访问可变状态。以前,“非隔离 async ”方法总是切换到管理并发线程池的全局执行器,这使得为类类型编写 async 方法时很难避免数据竞赛安全错误。在 Swift 6.2 中,您可以迁移到即将推出的功能,在该功能中,async函数在调用者的执行上下文中运行,即使在主行为体上调用也是如此。
  • 使用 @concurrent 选择并发: 使用新的 @concurrent 属性引入并发运行的代码。这就明确了何时希望代码在 actor 上保持序列化,何时希望代码并行运行。
// In '-default-isolation MainActor' mode

struct Image {
  // The image cache is safe because it's protected
  // by the main actor.
  static var cachedImage: [URL: Image] = [:]

  static func create(from url: URL) async throws -> Image {
    if let image = cachedImage[url] {
      return image
    }

    let image = try await fetchImage(at: url)

    cachedImage[url] = image
    return image
  }

  // Fetch the data from the given URL and decode it.
  // This is performed on the concurrent thread pool to
  // keep the main actor free while decoding large images.
  @concurrent
  static func fetchImage(at url: URL) async throws -> Image {
    let (data, _) = try await URLSession.shared.data(from: url)
    return await decode(data: data)
  }
}

通过这些改进,您可以以更少的注释开销编写无数据竞赛的代码,为异步代码提供更可预测的行为,同时还可以在需要时引入并发性。

元素周期表

安全系统编程

Swift 6.2 包含的功能旨在最大限度地提高性能,同时不影响安全性。这些功能可帮助您编写安全的底层代码,并实现可预测的性能和最小的开销。

InlineArray是一个新的固定大小的数组,具有元素内联存储功能,可以存储在堆栈中或直接存储在其他类型中,而无需额外的堆分配。您可以通过在元素前的小括号中写入大小,或使用 of 速记语法来引入内联数组:

struct Game {
  // Shorthand for InlineArray<40, Sprite>
  var bricks: [40 of Sprite]

  init(_ brickSprite: Sprite) {
    bricks = .init(repeating: brickSprite)
  }
}

新的 Span类型可安全地直接访问连续内存。Span 通过确保内存在使用过程中保持有效来维护内存安全。这些保证是在编译时检查的,没有运行时开销,并消除了指针固有的内存安全问题,例如使用后无错误。

除了新的应用程序接口,Swift 6.2 还增强了底层和安全关键型项目的功能:

  • 嵌入式 Swift: 嵌入式 Swift 现在包括 Swift 的完整 String API、用于类受限协议的 any 类型,以及新的 InlineArraySpan 类型。
  • 安全的 C++ 互操作性: 混合了 Swift 和 C++ 的项目可以利用 Swift 的安全抽象,如通过头注解为 C++ API 提供的 Span
  • 可选严格内存安全机制: Swift自诞生起便提供内存安全保障,同时允许在必要时使用不安全构造(如不安全指针),例如调用接受指针的C API。Swift 6.2引入的_可选严格内存安全机制_会标记不安全构造的使用场景,开发者可选择替换为安全替代方案,或在源代码中明确确认其安全性。该机制采用可选机制,因为多数项目无需此级别的强制要求——严格内存安全更适合安全需求最严苛的项目。

优化工作流程

除语言改进外,Swift 6.2 还优化了日常代码编辑、构建和调试的迭代流程。

VS Code Swift 扩展

VS Code Swift扩展现已通过Swift.org官方认证并分发。最新版本包含:

  • **默认后台索引:**编写代码时可即时享受快速更新的编辑器功能,如跳转定义和代码补全。
  • 内置 LLDB 调试: 在 VS Code 内直接使用 LLDB 逐步执行 Swift 代码、设置断点并检查状态。
  • Swift 项目面板: 在资源管理器视图中浏览 Swift 项目的目标、依赖项和任务。
  • 实时文档预览: 代码旁实时预览渲染后的文档,随输入即时更新。

这些工作流改进使您能够在首选环境中使用一流工具更轻松地处理 Swift 项目。

精确警告控制

Swift 6.2 通过允许在_诊断组_级别进行控制,增强了编译器警告的管理方式。诊断组是通过名称标识的警告类别。您可在 Swift 包清单中通过 SwiftSettingtreatWarning 方法指定诊断组内警告的行为,或使用 treatAllWarnings 方法将所有警告提升为错误。例如,可将除弃用 API 使用警告外的所有警告提升为错误:

.target(
  name: "MyLibrary",
  swiftSettings: [
    .treatAllWarnings(as: .error),
    .treatWarning("DeprecatedDeclaration", as: .warning),
  ]
)

宏构建性能

Swift 6.2 显著缩短了使用基于宏的 API 项目的干净构建时间。此前构建系统需先从源代码获取并构建 swift-syntax 包,再处理宏项目,这显著延长了编译时间(尤其在 CI 环境中)。SwiftPM 现支持预构建的 swift-syntax 依赖项,彻底消除了这一耗时的构建步骤。

增强的异步调试功能

Swift 6.2 通过 LLDB 调试时,大幅简化了并发代码运行状态的追踪流程:

  • 强大的async步进功能: 在LLDB中可靠地步入异步函数,即使该异步调用需要切换线程。
  • 显示任务上下文: 在断点处暂停时,以及查看当前线程的回溯信息时,可查看代码片段正在哪个任务上运行。
  • 命名任务: 创建任务时可赋予可读名称,这些名称将在调试和性能分析工具的任务上下文中显示。

迁移至即将推出的功能

Swift 6.2 包含 迁移工具 以助您采用即将推出的语言特性:

  • 识别源代码不兼容性: 通过迁移工具的警告识别在启用新特性后将无法编译或行为改变的代码模式。
  • **自动化代码修改:**应用修复方案更新代码,确保现有行为得以保留。

此机制通过消除繁琐的手动代码修改,简化了启用新功能的流程。您可在Swift迁移指南中深入了解迁移工具。

核心库更新

无论您是在管理外部进程、响应状态变化还是编写测试套件,Swift 6.2 中的库都在不断进化,助您编写更简洁安全的代码。

子进程

Swift 6.2 引入了全新的 Subprocess 包,提供了一套精简且支持并发的 API 用于启动和管理外部进程。该包包含基于 async/await 构建的 API、对进程执行的精细控制、平台特定配置等功能,非常适合脚本编写、自动化和服务器端任务:

import Subprocess

let swiftPath = FilePath("/usr/bin/swift")
let result = try await run(
  .path(swiftPath),
  arguments: ["--version"]
)

let swiftVersion = result.standardOutput

完整 API 接口详见 swift-subprocess 代码库 的 0.1 版本,您的使用反馈将指导 1.0 版本的 API 设计。

Foundation

Swift 6.2 中的 Foundation 库引入了现代化的 NotificationCenter API,采用具体通知类型替代字符串和无类型字典作为通知名称与有效负载。这意味着您可定义带存储属性的通知结构体,观察者能直接使用类型而无需依赖易出错的索引和动态转换。通知类型还通过遵循 MainActorMessageAsyncMessage 协议实现进行异步发布,从而避免处理主演员通知时的并发错误。

观察机制

Swift 6.2 通过全新的 Observations 异步序列类型,实现了对可观察类型的流式事务状态变更支持。更新包含对可观察属性的所有同步变更,且事务在下次暂停的await处结束。这可避免冗余的 UI 更新,提升性能,并确保代码响应的是值的一致快照。

Swift 测试

Swift 6.2 中的 Swift 测试新增 API 以增强测试和测试结果的表达力:

  • 退出测试 可验证代码在特定条件下(如先决条件失败)能否正常终止。退出测试在独立进程中运行,验证退出行为是否符合预期,从而像其他测试一样全面验证关键失败路径。
  • 附件功能 支持在测试结果中添加额外上下文信息,包括字符串、图像、日志及其他工件,这些内容可显示在测试报告中或写入磁盘。这使得通过具体证据诊断故障变得更容易——无论是 UI 状态的截图、JSON 有效负载,还是导致问题的步骤追踪记录。
  • 原始标识符显示名称 允许您用更少的代码自定义测试函数和套件类型的名称:
  -@Test("square() returns x * x")
  -func squareIsXTimesX() {
  +@Test func `square() returns x * x`() {
     #expect(square(4) == 4 * 4)
   }

WebAssembly 支持

Swift 6.2 新增对 WebAssembly(简称 Wasm)的支持。WebAssembly 是一款专注于可移植性、安全性与高性能的虚拟机平台。您可构建 Wasm 的客户端和服务器端应用程序,并部署到浏览器或其他运行时环境。更多 Wasm 信息请参阅 Swift 的 WebAssembly 支持愿景文档

致谢

衷心感谢所有分享经验、痛点与见解的开发者,正是你们的反馈指引了 Swift 6.2 的设计方向,尤其是亲和力强的并发模型。你们的意见清晰指明了语言友好性提升的空间、安全机制更自然化的方向,以及工具如何助力开发效率。Swift 6.2 的所有改进都源于你们的宝贵声音。

若您对 Swift 的发展前景充满期待,此刻正是加入 Swift 社区的最佳时机。无论是参与 Swift 演进流程、在 GitHub 上贡献代码,还是分享实际项目中使用该语言的体验反馈,每份心声都将塑造 Swift 的未来。无论您是经验丰富的程序员还是初入行者,我们的社区都以协作精神为根基,并欢迎新视角的加入。加入我们,向他人学习,共同助力 Swift 成为更卓越的语言。

后续行动

您可在Swift Evolution仪表盘查阅通过Swift Evolution流程获批并已集成至Swift 6.2的完整语言提案列表。

准备升级了吗?使用 Swiftly swiftly install 6.2 或访问 Swift.org/install 安装最新工具链,立即探索 Swift 6.2 的精彩功能。

本文文字及图片出自 Swift 6.2 Released

你也许感兴趣的:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注