簡體   English   中英

為什么我們可以將 flatMap 鏈接到 UserDefaults.standard.data

[英]Why can we chain flatMap to UserDefaults.standard.data

在 iOS 開發中有關 UserDefaults 的文章中,我看到了一個代碼片段,其中 flatMap 鏈接到 UserDefaults.standard.data,如下所示:

self.isReadStatuses = UserDefaults.standard.data(forKey: "isReadStatuses")
      .flatMap { try? JSONDecoder().decode([URL: Bool].self, from: $0) } ?? [:]

有誰知道為什么我們可以在這里使用.flatMap?

因為UserDefaults.standard.data(forKey:)返回Data? - 一個Optional<Data> ,並且Optional有一個.flatMap方法

具體來說, flatMap閉包獲取一個非可選的Data ,並嘗試對其進行解碼,返回另一個[URL:Bool]? (另外,由於try? )。

我可以猜到你為什么感到困惑,盡管我不確定。 我認為您認為.map (以及它的兄弟.flatMap.compactMap )只能用於 Collections (例如數組)。 那是完全錯誤的。 .map (和其他 2 個)具有轉換的含義,而不是遍歷集合/數組。 因此,雖然它們可以在 arrays 上使用,但它們也有更多的用例。
您可以在此處閱讀有關這 3 種map之間差異的更多信息。
在您展示的代碼中,該博客文章的作者使用.flatMapOptional<Data>值(又名 Data?)轉換為他想要的值[URL: Bool]

let udData = UserDefaults.standard.data(forKey: "isReadStatuses")

// Short way:
let isReadStatuses1 = udData.flatMap {
    try? JSONDecoder().decode([URL: Bool].self, from: $0)
} ?? [:]

// Long way:
let isReadStatuses2: [URL: Bool]
if let data = udData {
    isReadStatuses2 = (try? JSONDecoder().decode([URL: Bool].self, from: data)) ?? [:]
} else {
    isReadStatuses2 = [:]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM