Generic Instance Method 総称体インスタンスメソッド

compactMap(_:)

Creates an asynchronous sequence that maps an error-throwing closure over the base sequence’s elements, omitting results that don’t return a value. ある非同期シーケンスを作成します、それはあるエラースロークロージャを基底シーケンスのもつ要素のすべてにわたってマップします、値を返さない結果を省きます。

Declaration 宣言

func compactMap<ElementOfResult>(_ transform: @escaping (Base.Element) async throws -> ElementOfResult?) -> AsyncThrowingCompactMapSequence<AsyncPrefixWhileSequence<Base>, ElementOfResult>

Parameters パラメータ

transform

An error-throwing mapping closure. transform accepts an element of this sequence as its parameter and returns a transformed value of the same or of a different type. If transform throws an error, the sequence ends. あるエラースローマッピングクロージャ。transformはこのシーケンスのひとつの要素をそれのパラメータとして受け取り、同じもしくは異なる型の変換された値を返します。transformがエラーをスローするならば、そのシーケンスは終わります。

Return Value 戻り値

An asynchronous sequence that contains, in order, the non-nil elements produced by the transform closure. The sequence ends either when the base sequence ends or when transform throws an error. ある非同期シーケンス、それはtransformクロージャによって生み出された非nil要素それらを、順番に含みます。シーケンスは、基底シーケンスが終わる時かまたはtransformがエラーをスローする時に終わります。

Discussion 解説

Use the compactMap(_:) method to transform every element received from a base asynchronous sequence, while also discarding any nil results from the closure. Typically, you use this to transform from one type of element to another. compactMap(_:)メソッドを使うことで、基底非同期シーケンスから受け取ったあらゆる要素を変換してください、そして一方でまたあらゆるnil結果をクロージャから廃棄して。概して、あなたはこれを使ってある型の要素から別のものへと変換します。

In this example, an asynchronous sequence called Counter produces Int values from 1 to 5. The closure provided to the compactMap(_:) method takes each Int and looks up a corresponding String from a romanNumeralDict dictionary. Since there is no key for 4, the closure returns nil in this case, which compactMap(_:) omits from the transformed asynchronous sequence. When the value is 5, the closure throws MyError, terminating the sequence. この例において、Counterと呼ばれる非同期シーケンスは、Int値を1から5まで生み出します。compactMap(_:)メソッドに提供されたクロージャは、各Intをとり、そして対応しているStringromanNumeralDict辞書から捜します。4に対するキーがないことから、クロージャはnilをその場合には返します、それはcompactMap(_:)がこの変換されたシーケンスから省きます。値が5である場合、クロージャはMyErrorをスローして、シーケンスを終端しています。


let romanNumeralDict: [Int : String] =
    [1: "I", 2: "II", 3: "III", 5: "V"]


do {
    let stream = Counter(howHigh: 5)
        .compactMap { (value) throws -> String? in
            if value == 5 {
                throw MyError()
            }
            return romanNumeralDict[value]
        }
    for try await numeral in stream {
        print("\(numeral) ", terminator: " ")
    }
} catch {
    print("Error: \(error)")
}
// Prints: I  II  III  Error: MyError()