You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AsyncStream设置onTermination handler报Sendable编译错误如何解决?

AsyncStream设置onTermination编译报错解决方案

报错的核心原因是onTermination要求传入@Sendable类型的闭包,Swift后续正式版本增加了严格的并发安全校验,而原Swift演进提案的示例代码编写时该校验还未落地,所以会出现编译错误。

修正后的代码如下:

let t = Task.detached {
  func make123Stream() -> AsyncStream<Int> {
    AsyncStream { continuation in
      // 给闭包加上@Sendable标注即可解决编译报错
      continuation.onTermination = { @Sendable termination in
        switch termination {
        case .finished:
            print("Regular finish")
        case .cancelled:
            print("Cancellation")
        }
      }
      Task.detached {
        for n in 1...3 {
          continuation.yield(n)
          sleep(2)
        }
        continuation.finish()
      }
    }
  }

  for await n in make123Stream() {
    print("for-in: \(n)")
  }
  print("After")
}
sleep(3)
t.cancel()

如果是Xcode 14及以上版本开启了严格并发检查,也可以选择配置全局闭包隐式Sendable推断规则,但直接给对应闭包手动添加@Sendable标注的兼容性最好,是更推荐的写法。

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:36:04