如何调试"fatal error with nil while unwrapping an optional value"?



这是我写的第一个真正的应用程序,我不明白为什么我在解开可选时会遇到此" nil"错误。

在发布代码之前,这是一个简单的费用计算器的想法。

我有两个Textfields(Expenselabel和GuestLabel)。在应用程序的开头,两者都应该为空。这是第一个问题。如果用户意外按计算按钮,我会收到以下错误:

在解开可选值

时出乎意料地找到了无

(这是我在** ... **中下方标记的第一行代码。

只要用户输入数字或标签在应用程序开始时没有空的(例如,我在故事板上输入一个号码),但由于某些奇怪的原因,我会遇到相同的零错误在我更新resultlabel.text时,在第二行到最后一行(在** ... **中再次标记)。Xcode用以下额外信息标记此行:

线程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 = Double(expenseLabel.text!) ?? 0.0
guests = Double(guestLabel.text!) ?? 0.0

我认为这将有助于删除无编码的错误,但这也没有起作用。

我现在感到非常无助,因为这再次是代码不多,出于某种原因我根本看不起。

您必须检查

  • 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"
}

相关内容

  • 没有找到相关文章

最新更新