[英]Clearing UserDefaults.standard.data information doesn't actually delete it?
[英]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
之間差異的更多信息。
在您展示的代碼中,該博客文章的作者使用.flatMap
將Optional<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.