避免在Swift Combine框架中强制展开

时间:2019-06-22 16:54:27

标签: swift optional ios13 combine

在WWDC 2019视频721中,主要示例的基础如下所示:

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

这似乎是不可取的。如果没有userInfo,或者没有"data"键,或者它不是数据,该怎么办?我们将强制解开nil并使其崩溃。这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:5)

改为使用compactMap

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

如果我们的闭包产生可选数据,则将其解包并发布数据。如果我们的闭包产生nil,则什么也没有发生(什么都没有发布)。

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

相关问题