如何调试"fatal error with nil while unwrapping an optional value"?
How to debug "fatal error with nil while unwrapping an optional value"?
这是我正在编写的第一个真正的应用程序,我不明白为什么我在解包可选时会出现此 "nil" 错误。
在我 post 代码之前,这是一个简单的费用计算器的想法。
我有两个文本字段(expenseLabel 和 guestLabel)。在应用程序的开始,两者都应该是空的。这是第一个问题。如果用户不小心按下了计算按钮,我会收到以下错误:
unexpectedly found nil while unwrapping an Optional value
(这是我在** ... ** 中标记的第一行代码)。
只要用户在应用程序开始时输入数字或标签不为空(例如,我在情节提要中输入数字),就不会发生这种情况,但由于某些奇怪的原因,我得到了相同的结果当我更新 resultLabel.text 时,倒数第二行出现零错误(再次标记在 ** ... ** 内)。 Xcode 用以下额外信息标记这一行:
Thread 1: EXC_BAD_INSTRUCTION (code=EXE_I386_INVOP, subcode=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 和 guests:
expense = Double(expenseLabel.text!) ?? 0.0
guests = Double(guestLabel.text!) ?? 0.0
我认为这有助于消除 nil 解包错误,但效果不佳。
我现在感到很无助,因为这又不是很多代码,而且出于某种原因我认为它根本不起作用。
你必须检查
- 是
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"
}
这是我正在编写的第一个真正的应用程序,我不明白为什么我在解包可选时会出现此 "nil" 错误。
在我 post 代码之前,这是一个简单的费用计算器的想法。
我有两个文本字段(expenseLabel 和 guestLabel)。在应用程序的开始,两者都应该是空的。这是第一个问题。如果用户不小心按下了计算按钮,我会收到以下错误:
unexpectedly found nil while unwrapping an Optional value
(这是我在** ... ** 中标记的第一行代码)。
只要用户在应用程序开始时输入数字或标签不为空(例如,我在情节提要中输入数字),就不会发生这种情况,但由于某些奇怪的原因,我得到了相同的结果当我更新 resultLabel.text 时,倒数第二行出现零错误(再次标记在 ** ... ** 内)。 Xcode 用以下额外信息标记这一行:
Thread 1: EXC_BAD_INSTRUCTION (code=EXE_I386_INVOP, subcode=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 和 guests:
expense = Double(expenseLabel.text!) ?? 0.0
guests = Double(guestLabel.text!) ?? 0.0
我认为这有助于消除 nil 解包错误,但效果不佳。
我现在感到很无助,因为这又不是很多代码,而且出于某种原因我认为它根本不起作用。
你必须检查
- 是
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"
}