5

在 WWDC 2019 视频 721 中,主要示例的基础是这样开始的:

let trickNamePublisher = NotificationCenter.default.publisher(for: .newTrickDownloaded)
    .map { notification in
        return notification.userInfo?["data"] as! Data
    }

这似乎是不可取的。如果没有userInfo,或者它不包含"data"键,或者它不是数据,会发生什么?我们将强制展开nil并崩溃。这里的最佳做法是什么?

4

1 回答 1

8

改用compactMap

let trickNamePublisher = NotificationCenter.default.publisher(for: .newTrickDownloaded)
    .compactMap { $0.userInfo?["data"] as? Data }

如果我们的闭包产生一个可选数据,它会被解包并且我们发布数据。如果我们的闭包产生nil,则什么都不会发生(什么都不会发布)。

(令人惊讶的是视频没有这样写。在苹果的辩护中,正如 MartinR 和 Itai Ferber 指出的那样,视频假设我们自己正在发布通知,所以我们确定用户信息中的内容并强制-unwrapping 是合理的。这个问题和答案的重点是您从框架(例如 Cocoa)订阅通知的常见情况。此外,我不敢相信安全地展开是一个坏主意;在我自己的代码中,在组合框架之前,userInfo即使我自己发布通知,我也总是安全地解包值。)

于 2019-06-22T16:54:27.750 回答