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

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

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

最佳答案

使用 compactMap 代替:

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

如果我们的闭包产生了一个 Optional Data,它就会被解包并发布数据。如果我们的闭包产生 nil ,则什么都不会发生(什么都没有发布)。

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

关于swift - 避免在 Swift Combine 框架中强制解包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56717392/

10-09 05:15