Как избежать Nil / Nan в простом расчете - PullRequest
0 голосов
/ 08 декабря 2018

Я очень новичок в swift, и мой учебный проект заключается в создании калькулятора кросс-умножения.Но как избежать того, что в случае невозможного вычисления текстовая метка выдает выходной NaN или приложение вылетаетдействительный - или что я не так делаю?это не работает:

    if convert = false {
        output.text = "X"
    }

см. полный код ниже.

@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
@IBOutlet weak var textField3: UITextField!
@IBOutlet weak var output: UILabel!

@IBAction func calculationMethod(_ sender: Any) {
    let textField1Double: Double? = Double(textField1.text!)
    let textField2Double: Double? = Double(textField2.text!)
    let textField3Double: Double? = Double(textField3.text!)

    let convert = textField3Double! * textField2Double! / textField1Double!

    if convert = false {
        output.text = "X"
    }

    let convertText = String(convert)

    output.text = convertText

}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Вам необходимо проверить, содержат ли все текстовые поля значения Double.Если это так, вам нужно убедиться, что первое текстовое поле не равно 0.

if let textField1Double = Double(textField1.text!),
   let textField2Double = Double(textField2.text!), 
   let textField3Double = Double(textField3.text!), 
   textField1Double != 0 {
    let result = textField3Double * textField2Double / textField1Double
    output.text = String(result)
} else {
    output.text = "X"
}

Совет: Поскольку вы, кажется, новичок, посмотрите вверх Дополнительная цепочка для лучшего понимания решения.

0 голосов
/ 08 декабря 2018

Как видите, объект text является необязательным, что означает, что он может иметь значение или иметь внутри него ноль.

Когда вы используете "bang""(восклицательный знак) вы принудительно распаковываете необязательное (вы уверены, что оно имеет значение, таким образом, никогда не потерпит крах).

Во избежание этого просто используйте условное связывание:

if let possibleValue = textField1.text {
  // you can now safely use the possibleValue
}
else {
  // There is no value inside the optional object
}

Кроме того, вы можете создать расширение для UITextField, которое вместо записи if let каждый раз, когда вам нужно просто использовать вычисляемую переменную для этого:

extension UITextField {
 var doubleValue: Double {
   return textField1.text == nil ? 1 : Double(textField1.text)
 }
}

Примечание :

По умолчанию это строка "".

Конечно, приведенный выше фрагмент кода является лишь примером и может быть легко аварийно завершен, так что настройте его под свои нужды,Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...