有些情况下你忘了设置一个值(所以它实际上是一个bug),并且使用强制解包运行程序会导致问题崩溃,这可以让你找到你忘记设置值的错误已经设定.
从关于避免强制展开的帖子开始,总是提出强迫解包会导致程序崩溃,因此这是一件坏事.当一个问题确实存在错误时崩溃有什么问题呢?
请举例说明强制解包可能是坏事.
(我不是说强行打开适合所有事情.)
rma*_*ddy 12
强制解包(我也将包括强制转换)只应当你作为程序员知道一个事实,即nil除非nil在开发过程中代表一个明确的错误,否则它将永远不会出现.(然后你希望它崩溃).
有许多例子表明这种类型的强制展开是合适的.例子包括:
UITableView dequeueReusableCell(nil表示你的故事板中有错误).显然还有很多其他情况下强制解包是合适的,但你必须清楚地了解这些情况.
但是有很多运行时决策会导致您无法保证的选项,并且不应强制解包此类情况.
例子包括:
nil结果.throw或返回可选结果的任何API .事情可能会出错.错误发生.永远不要以为你会得到有效答案.代码防守.最后,具有适当经验和理解选项如何工作,它们意味着什么以及何时可能或可能不会实际存在价值的开发人员能够在适当时nil安全地使用强制解包.明智地使用它.
永远不要使用强制解包,因为Xcode建议让编译器满意.
强制展开是不好的,因为不能保证您的程序在执行时访问实际变量。发生这种情况时,您的程序可能会尝试对不存在的数字执行数学计算,并且您的应用程序将崩溃。您在开发阶段的观点是,如果崩溃,您将能够缩小崩溃发生的原因,并解决开发阶段运行时崩溃的问题,但是在生产中呢?
例如,如果您从网络服务中检索某种数字,您可能希望将此数字与本地的数字(可能是版本号)进行比较:
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)
在生产中,有些事情是您无法控制的(很多时候是服务器端问题),可能会导致变量未填充。这就是为什么最好有条件地解包以安全地访问代码中的值,以防止执行时崩溃。
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |