繁体   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