0

在一篇关于 iOS 开发中的 UserDefaults 的文章中,我看到了一个代码片段,其中 flatMap 链接到 UserDefaults.standard.data,如下所示:

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

有谁知道为什么我们可以在这里使用 .flatMap ?

4

2 回答 2

2

因为UserDefaults.standard.data(forKey:)返回 -an Data?Optional<Data>并且Optional有一个.flatMap方法

具体来说,flatMap闭包得到一个非可选的Data,并尝试解码它返回另一个[URL:Bool]?(也是可选的,因为try?)。

于 2021-04-12T13:04:58.070 回答
1

我可以猜到你为什么感到困惑,尽管我不确定。我认为您认为.map(和它的兄弟,.flatMapand .compactMap)只能用于集合(例如数组)。那是完全错误的。.map(和其他 2 个)具有transformation的含义,而不是遍历集合/数组。因此,虽然它们可以用于数组,但它们也有更多的用例。您可以在此处
阅读有关这 3 种之间差异的更多信息。 在您展示的代码中,该博客文章的作者使用意图一个值(又名数据?)转换为他想要的值。map
.flatMapOptional<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 = [:]
}
于 2021-04-12T13:18:41.037 回答