UITextField обрабатывается как nil, когда это не так

#swift #xcode

#swift #xcode

Вопрос:

У меня есть фрагмент кода, предназначенный для того, чтобы позволить пользователю изменять, какую единицу веса они используют. Если они уже ввели значение, оно автоматически преобразуется из килограммов в фунты. Оно изменяется нажатием на UISegmentedControl, где сегмент 0 равен килограмму, а сегмент 1 равен фунту.

Изменение в первый раз работает отлично, независимо от того, перешел ли пользователь с килограмма на фунт или наоборот. Однако при попытке выполнить второе преобразование программа немедленно завершает работу, утверждая, что значение в текстовом поле, содержащем weight, равно нулю, даже если оно явно содержит текст.

Вот мой код на данный момент:

 @IBAction func unitChanged(_ sender: UISegmentedControl) {
    if let text = weightInput.text, text.isEmpty {
        //Does nothing since there is no weight to change the unit of
    }
    else {
        let weight: Int? = Int(weightInput.text!)
        var weightDouble: Double = Double(weight!)
        
        if (weightTypeInput.selectedSegmentIndex == 0) {
            //The user is trying to change from pounds to kilograms
            weightDouble = weightDouble * 0.45359237
        }
        else {
            //The user is trying to change from kilograms to pounds
            weightDouble = weightDouble * 2.2046226218
        }
        weightInput.text = String(weightDouble)
    }
}
  

Вот как код выглядит на практике

Наконец, вот сообщение об ошибке, которое я получаю:

Поток 1: неустранимая ошибка: неожиданно обнаружено nil при развертывании необязательного значения

Если я задаю значение по умолчанию для weightDouble, оно всегда используется для всех последующих попыток преобразования. Кто-нибудь здесь сталкивался с подобной проблемой? Я попытался выполнить поиск в Интернете, но не смог найти ничего, что могло бы помочь.

Комментарии:

1. проблема с подключением к текстовому полю

2.попробуйте разрешить эти принудительно развернутые строки: a.) let weight: Int? = Int(weightInput.text!) и b.) var weightDouble: Double = Double(weight!) , потому что они совсем не выглядят хорошо.

Ответ №1:

Вы уверены, что текстовое значение вашего текстового поля равно нулю? Поскольку вы просто проверяете это в первом, если, на мой взгляд, это было бы не так.

Int не может анализировать числа с плавающей запятой в них. При этом возвращается nil. Возможно, вам захочется сначала разобрать его в Double, а затем преобразовать в Int.

Я думаю, что ваш код должен быть следующим:

 @IBAction func unitChanged(_ sender: UISegmentedControl) {
    guard let text = weightInput.text, !text.isEmpty, var weightDouble = Double(text) else { return }
    
    if (weightTypeInput.selectedSegmentIndex == 0) {
        //The user is trying to change from pounds to kilograms
        weightDouble = weightDouble * 0.45359237
    }
    else {
        //The user is trying to change from kilograms to pounds
        weightDouble = weightDouble * 2.2046226218
    }
    
    weightInput.text = String(Int(weightDouble))
}