AsyncSequence
声明
@rethrows protocol AsyncSequence
概述
AsyncSequence
类似于 Sequence
类型——提供一个可以一次通过一个值的列表——并增加了异步性。当您第一次使用 AsyncSequence
时,它的所有值、部分值或没有值可用。相反,您使用await
来接收可用的值。
与 Sequence
一样,您通常使用 for await
- in
循环遍历 AsyncSequence
。但是,由于调用者可能必须等待值,因此您使用 await
关键字。以下示例显示如何迭代 Counter
,这是一个自定义 AsyncSequence
,它产生从 1
到 howHigh
值的 Int
值:
for await i in Counter(howHigh: 10) {
print(i, terminator: " ")
}
// Prints: 1 2 3 4 5 6 7 8 9 10
AsyncSequence
不生成或包含值;它只是定义了您如何访问它们。除了将值的类型定义为称为 Element
的关联类型外,AsyncSequence
还定义了 makeAsyncIterator()
方法。这将返回 AsyncIterator
类型的实例。与标准 IteratorProtocol
一样,AsyncIteratorProtocol
定义了一个 next()
方法来生成元素。不同之处在于 AsyncIterator
将其 next()
方法定义为 async
,这需要调用者使用 await
关键字等待下一个值。
AsyncSequence
还定义了处理您收到的元素的方法,这些方法以标准库中基本 Sequence
提供的操作为模型。有两类方法:返回单个值的方法和返回另一个值的方法 AsyncSequence
。
Single-value 方法消除了对 for await
- in
循环的需要,而是让您进行单个 await
调用。例如,contains(_:)
方法返回一个布尔值,指示给定值是否存在于 AsyncSequence
中。给定上一个示例中的 Counter
序列,您可以使用 one-line 调用来测试序列成员是否存在:
let found = await Counter(howHigh: 10).contains(5) // true
返回另一个 AsyncSequence
的方法返回特定于方法语义的类型。例如,.map(_:)
方法返回 AsyncMapSequence
(或 AsyncThrowingMapSequence
,如果您提供给 map(_:)
方法的闭包可能引发错误)。这些返回的序列不会即刻地等待序列的下一个成员,这允许调用者决定何时开始工作。通常,您将使用 for await
- in
迭代这些序列,就像您开始使用的基础 AsyncSequence
一样。在以下示例中,map(_:)
方法将从 Counter
序列接收到的每个 Int
转换为 String
:
let stream = Counter(howHigh: 10)
.map { $0 % 2 == 0 ? "Even" : "Odd" }
for await s in stream {
print(s, terminator: " ")
}
// Prints: Odd Even Odd Even Odd Even Odd Even Odd Even
可用版本
相关用法
- Swift AsyncSequence dropFirst(_:)用法及代码示例
- Swift AsyncSequence reduce(_:_:)用法及代码示例
- Swift AsyncSequence first(where:)用法及代码示例
- Swift AsyncSequence prefix(_:)用法及代码示例
- Swift AsyncSequence map(_:)用法及代码示例
- Swift AsyncSequence allSatisfy(_:)用法及代码示例
- Swift AsyncSequence min()用法及代码示例
- Swift AsyncSequence drop(while:)用法及代码示例
- Swift AsyncSequence contains(_:)用法及代码示例
- Swift AsyncSequence max()用法及代码示例
- Swift AsyncSequence filter(_:)用法及代码示例
- Swift AsyncSequence flatMap(_:)用法及代码示例
- Swift AsyncSequence prefix(while:)用法及代码示例
- Swift AsyncSequence max(by:)用法及代码示例
- Swift AsyncSequence compactMap(_:)用法及代码示例
- Swift AsyncSequence min(by:)用法及代码示例
- Swift AsyncSequence contains(where:)用法及代码示例
- Swift AsyncStream用法及代码示例
- Swift AsyncStream first(where:)用法及代码示例
- Swift AsyncStream prefix(_:)用法及代码示例
- Swift AsyncStream drop(while:)用法及代码示例
- Swift AsyncStream max(by:)用法及代码示例
- Swift AsyncStream dropFirst(_:)用法及代码示例
- Swift AsyncStream reduce(_:_:)用法及代码示例
- Swift AsyncStream prefix(while:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 AsyncSequence。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。