为什么使用隐式解包或强制解包让应用程序在某个阶段崩溃没有好处?

2024-02-09

我的观点是,在某些地方,我们知道该变量根本不会为零,但由于某种原因,我们无法在类的 init 函数中实例化它,因此我们必须将其设为可选。

我也知道我们可以使用可选的绑定或防护技术来轻松摆脱它。

但在我看来,由于隐式解包/强制解包而让应用程序因一些非常愚蠢的错误而崩溃对于开发阶段的开发人员来说是有益的.

我的例子是:

class TopStoriesViewModelTests: XCTestCase {
    var viewModel: TopStoriesViewModel!

    override func setUp() {
        super.setUp()
        viewModel = TopStoriesViewModel(interactor: MockTopStoriesInteractor())
    }

    func testArticleDidVisited() {
        viewModel.visited = xxxxxx
    }
}

在这种情况下我可以使TopStoriesViewModel a ?然后保护它或者让它在每个测试用例中,但我觉得这是没有必要的。我知道我可能会使用viewModel?.xxx也。但这不是重点。

我的问题是,在某些特定情况下(例如我给出的示例),强制解包/隐式解包是有益的,这一点我是否正确。


当然。有许多强制展开的正确用途,其中崩溃只会在开发早期发生,因为已经犯了错误,一旦修复,崩溃就不会再发生。

一个常见的示例是访问资源包中的图像。一行例如:

let imagePath = Bundle.main.path(forResource: "image", ofType: "png")!

如果开发人员忘记瞄准目标,那么在早期开发中应该会崩溃image.png适当地。一旦正确定位,该行就不会崩溃,因此没有理由处理可选路径。

其他常见的例子是奥特莱斯。它们通常是隐式展开的,因为当它们在视图控制器的代码中使用时,它们已经被附加了。崩溃可能意味着插座连接不正确。问题解决了,就不用再担心了。无需处理警卫或其他可选检查。

最后一个例子(还有更多可能性)。当从表视图中使单元格出列时,将结果单元格强制转换为自定义单元格类型。不需要看守。我总是在这里看到使用守卫的代码as?如果转换失败则抛出致命错误。只是强制施放。使用更少的代码也会发生同样的崩溃。一旦表格视图和故事板正确,强制投射就不会失败。

话虽如此,新的 Swift 开发人员应该避免!键盘上的字符一段时间。知道何时安全使用它是一项需要学习的技能。

如果潜在的崩溃完全由开发人员控制,并且崩溃只能因为开发人员犯了错误而发生,那么使用!可能是合适的。

如果潜在的崩溃可能是由意外数据(JSON 解析、用户输入等)引起的,那么永远不要使用!。在这些情况下进行防御性编码。

tl;dr - 是的,在很多情况下,强制展开、强制转换和隐式展开变量是正确的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用隐式解包或强制解包让应用程序在某个阶段崩溃没有好处? 的相关文章

随机推荐

  • `ValueError: 太多值无法用 `scipy.stats.linregress` 解包(预期为 4)`

    我知道这个错误消息 ValueError too many values to unpack expected 4 当设置的变量数量多于函数返回的值时 就会出现 scipy stats linregress根据 scipy 文档返回 5 个
  • 在哪里可以学习对数? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在编程环境中经常听到对数的提及 它们似乎可以解决许多问题 但我似乎无法找到使用它们的现实方法 我读过
  • Twilio IBM Watson Speech To Text Addon 回调功能未触发

    我的目标是使用 Twilio 平台上提供的 IBM Watson Speech to Text Addon Twilio 附加功能 进行转录 呼叫者的输入 IVR 对话 IBM Watson 语音转文本插件已安装 Problem 回调 UR
  • 在Java中,如何更有效地追加字符串? [复制]

    这个问题在这里已经有答案了 我写了一个Java程序 我需要在其中附加一个字符串 u13a2 到现有的 u1234 u12de u1386 u15a3 渐渐地 绳子变得越来越长 我发现每次追加所花费的时间也变得越来越长 有什么办法可以在一定程
  • Pylint 函数名称无效

    我正在使用 Python 3 6 2 运行 Pylint 1 7 2 Pylint 显示以下错误 Invalid function name create maximization option dataframe invalid name
  • jQuery 悬停在表格上的效果

    我是 jQuery 新手 我想在我的桌子上制作悬停效果 但我不知道如何做 我只想将文本设为红色 然后在焦点丢失时如何再次删除红色 这是我到目前为止所拥有的 table border 1 tr th ID th th name th tr t
  • 使用四元数的设备方向

    我编写了一个 JS SDK 来监听移动设备旋转 提供 3 个输入 角度范围为 0 到 360 度 180 到 180 度之间的角度 90 到 90 度之间的角度 设备轮换的文档 https www sitepoint com using d
  • 拖放数据时清除输入字段

    我编写了一个函数 当用户将注意力集中在输入字段上时 该函数会自动清除输入字段的预设值 如果用户没有输入任何值 则将其恢复为模糊状态 所以的价值
  • 触摸浏览器中的元素(如指针事件:无)

    问题 我搜索了又搜索 但找不到有关如何通过覆盖元素触发触摸事件的信息 我通过使用以下方法解决了鼠标单击事件的问题 pointer events none 这很简单 但它不适用于触摸事件 我知道有一些移动原生的东西可以解决这个问题 但这纯粹是
  • 如何使用 Entity Framework 4.1 将连接字符串传递给数据库优先 DBContext 的构造函数?

    由于各种原因我想not将我的实体框架数据库模型的连接字符串存储在各种 config 文件之一中 我将最新最好的 DBContext API 与新的实体框架版本 4 1 NET 4 和 Visual Studio 2010 C 结合使用 但是
  • 为什么重写的函数首先被调用?

    我执行了以下程序 我对得到的输出感到好奇 其中函数输出首先被打印 即使它是我尝试首先打印的变量 class Baap public int h 4 public int getH System out println Baap h retu
  • 生产环境中无法解释的 SQL 错误 - 可能与网络相关

    我正在做一些相当密集的数据库工作 最终将很多很多记录插入到数据库中 为了尽量减少上下文膨胀 我一次执行 100 个插入 处理上下文 然后重新创建上下文 我收到一些我不明白的奇怪错误 这些错误仅发生在我们的生产服务器上 但在开发服务器上一切正
  • iOS 9 CollectionView 速度变慢

    我一直在为 iOS8 开发我的应用程序 并且在滚动速度方面还没有遇到任何问题 当我升级到 iOS9 时 collectionView 变得非常不稳定和令人震惊 我无法指出任何具体原因 在我的集合视图中 我的项目包含使用第 3 方库 SDWe
  • 如何检测 WiFi 网络共享状态

    我想知道如何检测 WiFi 网络共享的状态 我看过一篇文章 Android 2 3 wifi热点API https stackoverflow com questions 7048922 android 2 3 wifi hotspot a
  • 检查字符串是否在 python 中的 2 GB 字符串列表中

    我有一个大文件 A txt 2 GB 包含字符串列表 Question Q1 Q2 Q3 Ans1 Format links 现在我有另一个更大的文件 1TB 其中第二个位置包含上述字符串 Output a Question b The q
  • Java 8 流 - 对象的总和

    假设我有一个实现以下接口的对象列表 public interface Summable
  • Pytorch 张量索引:如何通过包含索引的张量收集行

    我有张量 ids 形状 7000 1 包含索引 例如 1 0 2 x 形状 7000 3 255 ids张量编码粗体标记维度的索引x应该选择哪个 我想将选定的切片收集到结果向量中 result 形状 7000 255 背景 我对这 3 个元
  • 关于 Arm 处理器上的 conda 发行版/通道的混乱

    我已经使用 Anaconda 几年了 但自从我开始使用带有 M1 处理器的 Mac 以来 我不得不处理一些软件包安装的一系列问题 这让我对一些基本概念有点困惑 例如 我试图安装 Tensorflow 结果发现正确的方法是安装 minifor
  • 使用 psycopg 准备的语句

    我是 python 的初学者 我们使用此代码来执行 SQL 命令 cur execute INSERT INTO test num data VALUES s s 100 abcdef 我想知道这是准备好的声明还是只是客户端引用 不 不是
  • 为什么使用隐式解包或强制解包让应用程序在某个阶段崩溃没有好处?

    我的观点是 在某些地方 我们知道该变量根本不会为零 但由于某种原因 我们无法在类的 init 函数中实例化它 因此我们必须将其设为可选 我也知道我们可以使用可选的绑定或防护技术来轻松摆脱它 但在我看来 由于隐式解包 强制解包而让应用程序因一