Как отладить "фатальную ошибку с nil при развертывании необязательного значения"?

Это мое первое реальное приложение, которое я пишу, и я не понимаю, почему я получаю эту "нулевую" ошибку при развертывании необязательного.

Прежде чем опубликовать код, вот идея простого калькулятора расходов.

У меня есть два текстовых поля (costLabel и guestLabel). В начале приложения оба должны быть пустыми. Вот первая проблема. Если пользователь случайно нажимает кнопку расчета, я получаю следующую ошибку:

неожиданно обнаружил ноль при развертывании необязательного значения

(Это первая строка кода, которую я пометил ниже в пределах ** ... **).

Пока пользователь вводит числа или метка не пуста в начале приложения (например, я ввожу число в раскадровке), этого не происходит, но по какой-то странной причине я получаю такую ​​же нулевую ошибку на втором до последней строки (снова отмеченной в пределах **... **), когда я обновляю 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, но это не сработало.

Я чувствую себя довольно беспомощным сейчас, потому что опять-таки это не так много кода, и по какой-то причине я не вижу, что он вообще не работает.

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"
}
Другие вопросы по тегам