Protocol

AsyncSequence

A type that provides asynchronous, sequential, iterated access to its elements. ある型、それはそれの要素それらに対して非同期の、順次的な、反復したアクセスを提供するものです。

Declaration 宣言

protocol AsyncSequence

Overview 概要

An AsyncSequence resembles the Sequence type — offering a list of values you can step through one at a time — and adds asynchronicity. An AsyncSequence may have all, some, or none of its values available when you first use it. Instead, you use await to receive values as they become available. あるAsyncSequenceは、それの値の全て、いくつか、または0個を、あなたがそれを最初に使う時に利用可能とするかもしれません。その代わりに、あなたはawaitを使って値それらをそれらが利用可能になるにつれて回収します。

As with Sequence, you typically iterate through an AsyncSequence with a for await-in loop. However, because the caller must potentially wait for values, you use the await keyword. The following example shows how to iterate over Counter, a custom AsyncSequence that produces Int values from 1 up to a howHigh value: Sequenceでのように、あなたは概してAsyncSequencefor await-inループで始めから終わりまで反復処理します。しかしながら、呼び出し側が潜在的に値それらに対して待機することから、あなたはawaitキーワードを使います。以下の例は、どのようにCounter、あるあつらえのAsyncSequenceInt値を1からhowHigh値に至るまで生み出すもの、のすべてにわたって反復するかを示します:


for await i in Counter(howHigh: 10) {
    print(i, terminator: " ")
}
// Prints: 1 2 3 4 5 6 7 8 9 10

An AsyncSequence doesn’t generate or contain the values; it just defines how you access them. Along with defining the type of values as an associated type called Element, the AsyncSequence defines a makeAsyncIterator() method. This returns an instance of type AsyncIterator. Like the standard IteratorProtocol, the AsyncIteratorProtocol defines a single next() method to produce elements. The difference is that the AsyncIterator defines its next() method as async, which requires a caller to wait for the next value with the await keyword. AsyncSequenceは、値それらを生成または含みません;それはただどのようにあなたがそれらにアクセスするかを定義するだけです。値それらの型をElementと呼ばれる関連型として定義することに加えて、AsyncSequencemakeAsyncIterator()メソッドを定義します。これは、型AsyncIteratorのあるインスタンスを返します。標準的なIteratorProtocolのように、AsyncIteratorProtocolはただ1つのnext()メソッドだけを定義して要素それらを生み出します。その違いは、AsyncIteratorはそれのnext()メソッドをasyncとして定義することです、それは呼び出し側に次の値を待つようにawaitキーワードで要求します。

AsyncSequence also defines methods for processing the elements you receive, modeled on the operations provided by the basic Sequence in the standard library. There are two categories of methods: those that return a single value, and those that return another AsyncSequence. AsyncSequenceはまた、あなたが受け取る要素を処理するために、標準ライブラリの基本のSequenceによって提供される演算を手本にしてメソッドいくつかを定義します。2つのカテゴリのメソッドがあります:ある単一の値を返すもの、そして別のAsyncSequenceを返すもの。

Single-value methods eliminate the need for a for await-in loop, and instead let you make a single await call. For example, the contains(_:) method returns a Boolean value that indicates if a given value exists in the AsyncSequence. Given the Counter sequence from the previous example, you can test for the existence of a sequence member with a one-line call: 単一値のメソッドそれらは、for await-inループの必要性を排除します、そして代わりにあなたにある単一のawait呼び出しをさせます。例えば、contains(_:)メソッドはあるブール値を返します、それはある与えられた値がAsyncSequenceの中に存在するかどうかを指し示します。以前の例からのCounterシーケンスを与えられて、あなたはあるシーケンスメンバーの存在を一行呼び出しで試験できます:


let found = await Counter(howHigh: 10).contains(5) // true

Methods that return another AsyncSequence return a type specific to the method’s semantics. For example, the .map(_:) method returns a AsyncMapSequence (or a AsyncThrowingMapSequence, if the closure you provide to the map(_:) method can throw an error). These returned sequences don’t eagerly await the next member of the sequence, which allows the caller to decide when to start work. Typically, you’ll iterate over these sequences with for await-in, like the base AsyncSequence you started with. In the following example, the map(_:) method transforms each Int received from a Counter sequence into a String: もう1つのAsyncSequenceを返すメソッドそれらは、メソッドのもつ意味論に特有のひとつの型を返します。例えば、.map(_:)メソッドはあるAsyncMapSequenceを返します(またはAsyncThrowingMapSequenceを、あなたがmap(_:)メソッドに提供するクロージャがエラーをスローするならば)。それら返されるシーケンスは、そのシーケンスの次のメンバーを熱心には待ちません、それは呼び出し側にいつ仕事を開始するのか決定するのを許可します。概して、あなたはそれらシーケンスのすべてにわたってfor await-inで反復処理をするでしょう、あなたがそれで始めた基本的なAsyncSequenceのように。以下の例において、map(_:)メソッドはCounterシーケンスから受け取った各IntStringへと変換します:


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

Topics 話題

Creating an Iterator イテレータを作成する

Finding Elements 要素を見つける

Selecting Elements 要素の選択

Excluding Elements 要素を除外する

Transforming a Sequence シーケンスを変形する

Adapting Textual Sequences テキストシーケンスに適応する

See Also 参照

Asynchronous Sequences 非同期シーケンス