尝试转换为double时出现此错误。有什么想法吗?
class ViewController : UIViewController {
@IBOutlet var textField : UITextField!
@IBOutlet var answerButton : UIButton!
@IBOutlet var fahrenheitLabel : UILabel!
@IBAction func tempFieldEditingChange(_ textField: UITextField) {
fahrenheitLabel.text = textField.text
}
@IBAction func showAnswer (_ sender : UIButton) {
let temperatures = ["hot","warm","cool","cold"]
let thresholds : [Double] = [80,60,40,0]
let temperature = Double(textField.text) //<-- (ERROR)
for (i,threshold) in thresholds.enumerated() {
if temperature >= threshold {
fahrenheitLabel.text = temperatures[i]
break
}
}
}
}
尝试用户输入温度并用热的冷或冷来吐出标签。我知道我失踪的东西请帮忙!谢谢。
答案 0 :(得分:1)
textField.text
是可选字符串,因此您需要先将值解包,然后再将值传递给不接受可选项的函数,例如Double(_ String:)
初始化程序。
我会使用guard
语句来执行此操作。该字符串可能无法解析为Double,因此初始化程序还返回一个可选的,需要将其解包。
@IBAction func showAnswer (_ sender : UIButton) {
guard let text = textField.text else {
return
}
let temperatures = ["hot","warm","cool","cold"]
let thresholds : [Double] = [80,60,40,0]
if let temperature = Double(text) {
for (i,threshold) in thresholds.enumerated() {
if temperature >= threshold {
fahrenheitLabel.text = temperatures[i]
break
}
}
}
}
}
答案 1 :(得分:1)
UITextField.text
属性返回可选的String?
类型。 Double
的初始化程序需要定期String
。
要使用text
属性,必须首先“解包”它,即将其从可选值转换为非可选值。有几种方法可以做到:
如果您确定,text属性不是nil,则可以强行打开它。但请注意,当您尝试强行打开零值时,您的应用程序将崩溃。
if textField.text != nil {
let temperature = Double(textField.text!)
}
在这种情况下,text
属性永远不应为零。但是,如果有一些代码更改了if
语句中的属性,并且在强行解包该属性的行之前,强制解包可能会崩溃。
此方法允许您通过将其值绑定到另一个常量/变量来安全地展开属性,并且一旦绑定了该值,就可以自由使用它,而不会将其变为nil。
if let temperatureValue = textField.text {
let temperature = Double(temperatureValue)
}
在整个if-let范围内,展开的temperatureValue
常量将保持可用且不可选,这意味着直到if-let语句的结束括号,您可以自由地使用它并将在声明的大括号。如果textField.text
为nil,则语句的大括号内部将永远不会被执行。
您可以使用if-let
语句代替guard-let
:
guard let temperatureValue = textField.text else {
return
}
let temperature = Double(temperatureValue)
请注意,任何guard
语句都要求函数在语句失败时返回,但是在函数的其余部分中可以正常访问展开的值,而不仅仅是在语句的结束括号中,如if-let
。
最后一件事:Double
的{{1}}初始化程序也返回一个可选值 - 所以为了使用它(例如与其他String
值比较),你必须打开它:
Double
答案 2 :(得分:0)
这应该与if let
方式
let atextField = UITextField(frame: .zero)
atextField.text = "55.9"
if let d = Double(atextField.text!) {
print(d)
} else {
print("no")
}
答案 3 :(得分:0)
您需要解开.text
。我将如何做到这一点:
class ViewController : UIViewController {
@IBOutlet var textField : UITextField!
@IBOutlet var answerButton : UIButton!
@IBOutlet var fahrenheitLabel : UILabel!
@IBAction func tempFieldEditingChange(_ textField: UITextField) {
fahrenheitLabel.text = textField.text
}
@IBAction func showAnswer (_ sender : UIButton) {
guard let text = textField else {
fatalError("Handle case when textField.text is nil") // TODO
}
guard let temperature = Double(textField) {
fatalError("Handle case when textField.text is nonnil but not a double") // TODO
}
switch temperature {
case ..<40: textField.text = "cold"
case 40..<60: textField.text = "cool"
case 60..<80: textField.text = "warm"
case 80...: textField.text = "hot"
default: fatalError("Non-exhaustive temperature ranges!")
}
}
}