【发布时间】:2019-06-22 16:54:27
【问题描述】:
在 WWDC 2019 视频 721 中,主要示例的基础是这样开始的:
let trickNamePublisher = NotificationCenter.default.publisher(for: .newTrickDownloaded)
.map { notification in
return notification.userInfo?["data"] as! Data
}
这似乎是不可取的。如果没有userInfo,或者它不包含"data" 键,或者它不是数据,会发生什么?我们将强制解开nil 并崩溃。这里的最佳做法是什么?
【问题讨论】:
-
在这个特定示例中,发布通知的是 your 代码,因此您知道用户数据中的内容。崩溃会显示编程错误。
-
我正要说同样的话,但马丁抢了我。该示例显示了来自应用程序不同部分的通知;数据存在于其中的事实是不变量。如果不是这种情况,则首选
compactMap。 -
@ItaiFerber 关键是视频可能已经提到了这一点。此外,使用
compactMap和安全解包怎么会永远受到伤害?因此是问题中的“最佳实践”。 -
@MartinR 我会将这一区别添加到答案的表述中。
-
@matt 它当然不会受到伤害,永远 - 我认为对于这个特定的例子,更多的人熟悉
map而不是compactMap,并且能够掩盖@987654329 的事实@ 能够从流中删除值(它开始提出比这里回答的问题更多的问题)使示例保持简洁。我同意你在这里应该使用compactMap。
标签: swift optional ios13 combine