无法为类型' Double'调用初始化程序。使用类型'(String?)'的参数列表 - Swift故事板

时间:2017-11-21 19:08:56

标签: ios swift storyboard

尝试转换为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
                }
             }
         }
   }

尝试用户输入温度并用热的冷或冷来吐出标签。我知道我失踪的东西请帮忙!谢谢。

4 个答案:

答案 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!")
        }
    }
}