如何在展开可选值时调试“nil 的致命错误”?
Posted
技术标签:
【中文标题】如何在展开可选值时调试“nil 的致命错误”?【英文标题】:How to debug "fatal error with nil while unwrapping an optional value"? 【发布时间】:2016-12-20 18:00:40 【问题描述】:这是我正在编写的第一个真正的应用程序,但我不明白为什么我在打开可选项时会出现这个“nil”错误。
在我发布代码之前,这里有一个简单的费用计算器的想法。
我有两个文本字段(expenseLabel 和 guestLabel)。在应用程序开始时,两者都应该是空的。这是第一个问题。如果用户不小心按下了计算按钮,我会收到以下错误:
在展开可选值时意外发现 nil
(这是我在** ... **中标记的第一行代码)。
只要用户在应用程序开始时输入数字或标签不为空(例如,我在情节提要中输入数字)就不会发生这种情况,但由于某种奇怪的原因,我得到了同样的 nil 错误当我更新 resultLabel.text 时,在倒数第二行(再次标记在 ** ... ** 内)。 Xcode 用以下额外信息标记这一行:
线程 1:EXC_BAD_INSTRUCTION(代码=EXE_I386_INVOP,子代码=0x0)
代码如下:
class ViewController: UIViewController
@IBOutlet weak var expenseLabel: UITextField!
@IBOutlet weak var guestLabel: UITextField!
@IBOutlet weak var resultLabel: UILabel!
@IBAction func splitButton(_ sender: Any)
let expense = expenseLabel.text
let guests = guestLabel.text
**var result = Double(expense!)! / Double(guests!)!**
result = round(result * 100) / 100
**resultLabel.text = String(result)**
self.view.endEditing(true)
...
实际上代码并不多,但我不明白为什么会出现此错误。我什至尝试了以下方法,并首先介绍了费用和客人这两个变量:
expense = Double(expenseLabel.text!) ?? 0.0
guests = Double(guestLabel.text!) ?? 0.0
我认为这将有助于消除 nil 展开错误,但效果不佳。
我现在感到很无助,因为这又不是很多代码,而且出于某种原因,我认为它根本不起作用。
【问题讨论】:
我对学习 Swift 的人的建议是,在您熟悉该语言之前,切勿强制解包(也就是在变量名后使用!
)。强制展开一个值是一个非常明显的迹象,你正在破解某些东西并且没有正确执行它。请改用if let
或guard
来提取该值。
【参考方案1】:
你必须检查
text
属性是否为nil
?
(text
属性是否为空?)
text
属性中的字符串能否转换为Double
?
严格来说,在这种情况下第二个检查可以省略,因为空字符串无论如何都不能转换为Double
。
if let expense = expenseLabel.text, // !expense.isEmpty,
let expenseValue = Double(expense),
let guests = guestLabel.text, // !guests.isEmpty,
let guestValue = Double(guests)
let result = round((expenseValue / guestValue) * 100) / 100
resultLabel.text = String(result)
else
resultLabel.text = "Something went wrong"
【讨论】:
谢谢!这帮助很大! 你能用一句话解释一下 if let 语句是如何工作的吗?我试图理解这一点,并试图创建自己的,但由于某种原因,我的从未像你现在那样工作过。if let
将右表达式的未包装值分配给以下变量,否则会跳过关联的...
中的代码,这是非常基本的 Swift 内容。
再次感谢您的代码和解释。但是有一个问题:例如,当数字为 276,73(expenseLabel)时,使用了 if 语句的“else”部分,我不明白为什么。因此,它没有进行计算,而是输出“出了问题”!?
默认的小数分隔符是点而不是逗号。如果您想考虑逗号,请使用数字格式化程序。以上是关于如何在展开可选值时调试“nil 的致命错误”?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复:“致命错误:在展开可选值 (lldb) 时意外发现 nil”
NSDictionary:错误在展开可选值时意外发现 nil
如何修复“线程 1:致命错误:在展开可选值时意外发现 nil”错误? [复制]