热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

避免在SwiftCombine框架中强制展开

如何解决《避免在SwiftCombine框架中强制展开》经验,为你挑选了1个好方法。

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

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

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



1> matt..:

使用compactMap来代替:

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

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

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


推荐阅读
author-avatar
手机用户2502905845
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有