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