我是一个非常迅速的初学者,我的学习项目是建立一个“交叉乘法”计算器。但是,如果无法进行计算,该如何避免文本标签给出输出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
}
答案 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)
}
}
注意:
此字符串默认为“”。
当然,上面的代码片段只是一个示例,很容易崩溃,因此请根据自己的需要进行调整,祝您好运