我所做的一切,尝试啊啊啊,在解开一个可选值时给我发现致命错误。
是的我知道你永远不应该强行解开,但是xcode迫使我把该死的!
!
我有一个输入字段,我从另一个函数调用,必须返回Double
:
@IBOutlet weak var inputField: UITextField!
// viewDidLoad():
inputField.keyboardType = .decimalPad
// Fail!
func returnDouble() -> Double {
guard let f = inputField.text else {return 0.00 }
return Double(f)!
}
// Fail!
func returnDouble() -> Double {
// if let f = (inputField.text?.characters.count)! > 0 {} // mega fail
guard let f = inputField.text else {return 0.00 }
return Double(f)!
}
// Fail!
func returnDouble() -> Double {
if let f = inputField.text {
return Double(f)!
} else {
return 0.00
}
}
我在这一点上输了。如果输入字段为空,我应该0.0
或者如果不是,则输入值。我也试过了inputField.hasText
但是我被迫添加!
并且它也崩溃了。还有第二只眼睛吗?
答案 0 :(得分:0)
这听起来可能违反直觉。
如果您在文字字段为空时访问textField.text
,则会获得""
而不是nil
。
您的所有三次尝试都会检查文字是nil
。但由于文本字段的文本几乎从不nil
,因此您的保护语句总是成功。
现在您拥有包含值f
的变量""
。您将其传递给Double
初始值设定项。你基本上是在写:
Double("")!
好吧,Double("")
失败并返回nil
,然后强行打开它。 BOOM!
你要检查的是一个空字符串:
func returnDouble() -> Double {
if inputField.text != "" {
return Double(f)!
} else {
return 0.00
}
}