#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))
}