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


Swift AsyncSequence compactMap(_:)用法及代碼示例


用法一

實例方法

compactMap(_:)

創建一個異步序列,將 error-throwing 閉包映射到基本序列的元素上,省略不返回值的結果。

聲明

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

返回值

一個異步序列,按順序包含由 transform 閉包生成的非 nil 元素。當基本序列結束或transform 引發錯誤時,序列結束。

參數

transform

error-throwing 映射閉包。 transform 接受此序列的元素作為其參數,並返回相同或不同類型的轉換值。如果transform 引發錯誤,則序列結束。

詳述

使用 compactMap(_:) 方法轉換從基本異步序列接收到的每個元素,同時丟棄閉包中的任何 nil 結果。通常,您使用它從一種類型的元素轉換為另一種類型的元素。

在此示例中,名為 Counter 的異步序列生成從 15Int 值。提供給compactMap(_:) 方法的閉包接受每個Int 並從romanNumeralDict 字典中查找相應的String。由於 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()

可用版本

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

用法二

實例方法

compactMap(_:)

創建一個異步序列,將給定的閉包映射到異步序列的元素上,省略不返回值的結果。

聲明

@preconcurrency func compactMap<ElementOfResult>(_ transform: @escaping (Self.Element) async -> ElementOfResult?) -> AsyncCompactMapSequence<Self, ElementOfResult>

返回值

一個異步序列,按順序包含由 transform 閉包生成的非 nil 元素。

參數

transform

映射閉包。 transform 接受此序列的元素作為其參數,並返回相同或不同類型的轉換值。

詳述

使用 compactMap(_:) 方法轉換從基本異步序列接收到的每個元素,同時丟棄閉包中的任何 nil 結果。通常,您使用它從一種類型的元素轉換為另一種類型的元素。

在此示例中,名為 Counter 的異步序列生成從 15Int 值。提供給compactMap(_:) 方法的閉包接受每個Int 並從romanNumeralDict 字典中查找相應的String。因為 4 沒有鍵,所以在這種情況下,閉包返回 nil,而 compactMap(_:) 從轉換的異步序列中省略。


let romanNumeralDict: [Int : String] =
    [1: "I", 2: "II", 3: "III", 5: "V"]
    
let stream = Counter(howHigh: 5)
    .compactMap { romanNumeralDict[$0] }
for await numeral in stream {
    print("\(numeral) ", terminator: " ")
}
// Prints: I  II  III  V

可用版本

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

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 AsyncSequence compactMap(_:)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。