Swift Concurrency AsyncStream 中的类型擦除

Nic*_*gen 5 swift swift-concurrency

在试验 Swift 的并发性时,我希望有一个干净的 API 来公开给定元素类型的异步序列及其节流版本:

  var intStream: AsyncStream<Int> {
    AsyncStream<Int>(Int.self, bufferingPolicy: .bufferingNewest(5)) { continuation in
      Task.detached {
        for _ in 0..<100 {
          try await Task.sleep(nanoseconds: 1 * 1_000_000_000)
          continuation.yield(Int.random(in: 1...10))
        }
        continuation.finish()
      }
    }
  }
  
  var throttledIntStream: AsyncStream<Int> {
    intStream.throttle(for: .seconds(2))
  }
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为节流阀返回其自己的类型:错误: Cannot convert return expression of type 'AsyncThrottleSequence<AsyncStream<Int>, ContinuousClock, Int>' to return type 'AsyncStream<Int>'

为了获得类型擦除我可以做

var throttledIntStream: some AsyncSequence {
  intStream.debounce(for: Duration.seconds(2))
}
Run Code Online (Sandbox Code Playgroud)

但随后我也丢失了我想保留的元素类型信息。

有什么建议如何最好地解决这个问题?

编辑:这指向我想要的解决方案,但我想我需要等待https://forums.swift.org/t/anyasyncsequence/50828/2

Cy-*_*4AH 0

使用遇到什么问题

var throttledIntStream: AsyncThrottleSequence<AsyncStream<Int>, ContinuousClock, Int>{
  intStream.throttle(for: .seconds(2))
}
Run Code Online (Sandbox Code Playgroud)

你从哪里得到AsyncThrottleSequence?无论如何,您可以使用以下内容扩展 AsyncStream:

extension AsyncStream {
  typealias throttled = AsyncThrottleSequence<AsyncStream<Element>, ContinuousClock, Element>
}
Run Code Online (Sandbox Code Playgroud)

并将其用作:

var throttledIntStream: AsyncStream<Int>.throttled {
    intStream.throttle(for: .seconds(2))
  }
Run Code Online (Sandbox Code Playgroud)