有些情况下你忘记设置一个值(所以它实际上是一个错误),并且使用强制解包运行程序可能会导致问题崩溃,这可以让你追踪你忘记设置值的错误你应该设置的。
从谈论避免强制解包的帖子中,总是提出强制解包会导致程序崩溃,因此这是一件坏事。当问题实际上存在错误时崩溃有什么不好?
请举例说明强制解包的坏处。
(我并不是说强制展开适用于所有情况。)
最佳答案
强制解包(我也将包括强制转换)只应该在你作为程序员知道一个事实永远不会是 nil
的情况下使用除非 nil
代表开发期间代码中的明显错误(然后您希望它崩溃)。
有很多例子表明这种类型的强制解包是合适的。示例包括:
- 获取应用程序包中已知文件的路径(nil 表示您在开发期间忘记定位该文件)。
- 强制调用
UITableView dequeueReusableCell
(nil 表示您的 Storyboard中有错误)。 - 从 DateComponents 中获取一个特定的组件,当您专门向 Calendar 询问该组件时(nil 意味着您有错字)。
显然还有许多其他情况适合强制解包,但您必须清楚地了解这些情况。
但是有很多运行时决策会导致您无法保证的可选值,因此不应强制展开此类情况。
示例包括:
- 处理任何用户输入。永远不要假设用户输入有效数据。永远不要假设一个值可以按预期进行转换。始终检查
nil
结果。 - 解析 JSON 结果。永远不要假设您获得的数据符合某种预期格式,即使该格式已明确记录并且似乎总是有效。事情会随着时间而改变。优雅地处理此类意外数据,而不是仅仅假设一个值将始终存在并且具有假定的数据类型。
- 处理任何可以
throw
或返回可选结果的 API。事情可能会出错。错误发生。永远不要假设你会得到一个有效的答案。防御性编码。
最后,具有适当经验并了解可选值的工作原理、它们的含义以及值何时可能为或可能不会为 nil
的开发人员能够安全地使用在适当的时候强制展开。明智地使用它。
永远不要仅仅因为 Xcode 建议它让编译器满意而使用强制解包。
关于swift - 为什么要避免强制展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46715568/