当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift AsyncSequence用法及代码示例


协议

AsyncSequence

一种提供对其元素的异步、顺序、迭代访问的类型。

声明

@rethrows protocol AsyncSequence

概述

AsyncSequence 类似于 Sequence 类型——提供一个可以一次通过一个值的列表——并增加了异步性。当您第一次使用 AsyncSequence 时,它的所有值、部分值或没有值可用。相反,您使用await 来接收可用的值。

Sequence 一样,您通常使用 for await - in 循环遍历 AsyncSequence。但是,由于调用者可能必须等待值,因此您使用 await 关键字。以下示例显示如何迭代 Counter ,这是一个自定义 AsyncSequence ,它产生从 1howHigh 值的 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

可用版本

iOS 13.0+, iPadOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+, tvOS 13.0+, watchOS 6.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 AsyncSequence。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。