Как отладить "фатальную ошибку с 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"
}