當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。