swift - 为什么要避免强制展开

标签 swift option-type

有些情况下你忘记设置一个值(所以它实际上是一个错误),并且使用强制解包运行程序可能会导致问题崩溃,这可以让你追踪你忘记设置值的错误你应该设置的。

从谈论避免强制解包的帖子中,总是提出强制解包会导致程序崩溃,因此这是一件坏事。当问题实际上存在错误时崩溃有什么不好?

请举例说明强制解包的坏处。

(我并不是说强制展开适用于所有情况。)

最佳答案

强制解包(我也将包括强制转换)只应该在你作为程序员知道一个事实永远不会是 nil 的情况下使用除非 nil 代表开发期间代码中的明显错误(然后您希望它崩溃)。

有很多例子表明这种类型的强制解包是合适的。示例包括:

  • 获取应用程序包中已知文件的路径(nil 表示您在开发期间忘记定位该文件)。
  • 强制调用 UITableView dequeueReusableCell(nil 表示您的 Storyboard中有错误)。
  • 从 DateComponents 中获取一个特定的组件,当您专门向 Calendar 询问该组件时(nil 意味着您有错字)。

显然还有许多其他情况适合强制解包,但您必须清楚地了解这些情况。

但是有很多运行时决策会导致您无法保证的可选值,因此不应强制展开此类情况。

示例包括:

  • 处理任何用户输入。永远不要假设用户输入有效数据。永远不要假设一个值可以按预期进行转换。始终检查 nil 结果。
  • 解析 JSON 结果。永远不要假设您获得的数据符合某种预期格式,即使该格式已明确记录并且似乎总是有效。事情会随着时间而改变。优雅地处理此类意外数据,而不是仅仅假设一个值将始终存在并且具有假定的数据类型。
  • 处理任何可以throw 或返回可选结果的 API。事情可能会出错。错误发生。永远不要假设你会得到一个有效的答案。防御性编码。

最后,具有适当经验并了解可选值的工作原理、它们的含义以及值何时可能为或可能不会为 nil 的开发人员能够安全地使用在适当的时候强制展开。明智地使用它。

永远不要仅仅因为 Xcode 建议它让编译器满意而使用强制解包。

关于swift - 为什么要避免强制展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46715568/

相关文章:

ios - SKAction 仅在 sleep 后或运行调试器时运行

ios - Swift 可选 - 解包可选值时意外发现 nil

swift - 为什么 Swift 的 enumerateSubstringsInRange 回调采用可选字符串?

c++ - 将 nullptr 转换为 std::optional

c++ - 为什么 std::optional::operator=(U&&) 要求 U 是非标量类型?

ios - super View 中的中心 View

ios - Swift-使用 Alamofire 发出多个 GET 请求时出现问题

swift - 无法使图表滚动,而不是缩放整个图表以适应空间

ios - Swift 类中覆盖的可选函数?

swift - 有没有一种方法可以在不测试的情况下运行闭包?