为什么要避免强行打开

And*_*ndy 5 optional swift

有些情况下你忘了设置一个值(所以它实际上是一个bug),并且使用强制解包运行程序会导致问题崩溃,这可以让你找到你忘记设置值的错误已经设定.

从关于避免强制展开的帖子开始,总是提出强迫解包会导致程序崩溃,因此这是一件坏事.当一个问题确实存在错误时崩溃有什么问题呢?

请举例说明强制解包可能是坏事.

(我不是说强行打开适合所有事情.)

rma*_*ddy 12

强制解包(我也将包括强制转换)只应当你作为程序员知道一个事实,即nil除非nil在开发过程中代表一个明确的错误,否则它将永远不会出现.(然后你希望它崩溃).

有许多例子表明这种类型的强制展开是合适的.例子包括:

  • 获取应用程序包中已知文件的路径(nil表示您在开发期间忘记定位文件).
  • 强制拨打电话UITableView dequeueReusableCell(nil表示你的故事板中有错误).
  • 当您专门向Calendar询问该组件时,从DateComponents获取特定组件(无意味着您有错字).

显然还有很多其他情况下强制解包是合适的,但你必须清楚地了解这些情况.

但是有很多运行时决策会导致您无法保证的选项,并且不应强制解包此类情况.

例子包括:

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

最后,具有适当经验和理解选项如何工作,它们意味着什么以及何时可能或可能不会实际存在价值的开发人员能够在适当时nil安全地使用强制解包.明智地使用它.

永远不要使用强制解包,因为Xcode建议让编译器满意.

  • @Deco如果用户在开发人员面前发现崩溃,并且崩溃是针对错误定位的文件或故事板中的错误,那么开发人员在将其提供给用户之前甚至没有运行他们自己的应用程序.不要那个开发者. (2认同)

Bra*_*n A 0

强制展开是不好的,因为不能保证您的程序在执行时访问实际变量。发生这种情况时,您的程序可能会尝试对不存在的数字执行数学计算,并且您的应用程序将崩溃。您在开发阶段的观点是,如果崩溃,您将能够缩小崩溃发生的原因,并解决开发阶段运行时崩溃的问题,但是在生产中呢?

例如,如果您从网络服务中检索某种数字,您可能希望将此数字与本地的数字(可能是版本号)进行比较:

if let json = try? JSONSerialization.jsonObject(with: responseData, options: .allowFragments) as? [String: Any], 
   let serverAPIVersion:NSNumber = json["API_Version_Number"] as? NSNumber {

    if self.currentAPIVersion.uintValue < serverAPIVersion.uintValue {
       self.updateVersionWith(number: serverAPIVersion)
    }

 }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们安全地"API_Version_Number"从服务器获取的 JSON 中解包。我们正在安全地展开,因为如果没有值,那么"API_Version_Number"当我们尝试与当前版本进行比较时,程序就会崩溃。

// This will crash if the server does not include "API_Version_Number in json response data
let serverAPIVersion:NSNumber = json["API_Version_Number"] as! NSNumber
Run Code Online (Sandbox Code Playgroud)

在生产中,有些事情是您无法控制的(很多时候是服务器端问题),可能会导致变量未填充。这就是为什么最好有条件地解包以安全地访问代码中的值,以防止执行时崩溃。