Build Codecov Platforms Swift 6.0

简介

IdentifiableContinuationCheckedContinuation 的轻量级封装,它遵循 Identifiable 协议,并包含一个易于使用的、带有 ID 的取消处理程序。

安装

可以使用 Swift Package Manager 安装 IdentifiableContinuation。

注意: IdentifiableContinuation 需要 Xcode 15.4+ 上的 Swift 5.10 或更高版本。它可在 iOS 13+、tvOS 13+、macOS 10.15+、Linux 和 Windows 上运行。要使用 Swift Package Manager 安装,请将此添加到您的 Package.swift 文件中的 dependencies: 部分

.package(url: "https://github.com/swhitty/IdentifiableContinuation.git", .upToNextMajor(from: "0.4.0"))

用法

在 Swift 6 中,用法与现有的 continuations 类似。

let val: String = await withIdentifiableContinuation { 
  continuations[$0.id] = $0
}

body 闭包在当前隔离中同步执行,允许 actors 修改其隔离状态。

当任务被取消时,会调用一个可选的取消处理程序。该处理程序是 @Sendable 类型的,可以在 body 完成之后的任何时间调用。

let val: String = await withIdentifiableContinuation { 
  continuations[$0.id] = $0
} onCancel: { id in
  // @Sendable closure executed outside of actor isolation requires `await` to mutate actor state
  Task { await self.cancelContinuation(with: id) }
}

以上内容也兼容使用 Swift 6 编译器(例如 Xcode 16)的 Swift 5 语言模式

Swift 5

虽然行为是相同的,但 Swift 5 编译器 (Xcode 15) 无法通过新的 #isolation 关键字 (SE-420) 继承 actor 隔离,因此必须始终传递对当前 actor 的 isolated 引用。

let val: String = await withIdentifiableContinuation(isolation: self) { 
  continuations[$0.id] = $0
}

鸣谢

IdentifiableContinuation 主要由 Simon Whitty 完成。

(完整贡献者列表)