如何在简单计算中避免Nil / nan

时间:2018-12-08 14:12:44

标签: ios swift uitextfield

我是一个非常迅速的初学者,我的学习项目是建立一个“交叉乘法”计算器。但是,如果无法进行计算,该如何避免文本标签给出输出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 :(得分:3)

您需要检查所有文本字段是否都包含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"
}

提示:由于您似乎是新手,因此请查阅Optional Chaining以更好地了解解决方案。

答案 1 :(得分:0)

如您所见,text对象是一个可选对象,这意味着它可以有一个值或内部可以为nil。

使用“ bang”(感叹号)时,您将强制展开一个可选的内容(您确定它具有一个值,因此永远不会崩溃)。

为了避免这种情况,只需使用条件绑定即可:

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

此外,您可以为UITextField创建扩展名,而不必每次都只需要使用计算所得的var来编写if let

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

注意

  

此字符串默认为“”。

当然,上面的代码片段只是一个示例,很容易崩溃,因此请根据自己的需要进行调整,祝您好运