如何修复无法将“Double”类型的值赋给“String?”在Swift3中

时间:2016-10-15 15:53:46

标签: swift3

我是一个快速的初学者,然后想写一个BMI计数。

错误无法将“Double”类型的值赋给“String?”

出现在label.text = GetBMI(H:myH,W:myW)

我该如何解决?

   @IBAction func calBMI(_ sender: AnyObject) {
    if Height.text != nil && Weight.text != nil {
        let myH : Double = (Height.text! as AnyObject).doubleValue
        let myW : Double = (Weight.text! as AnyObject).doubleValue
     label.text = GetBMI(H: myH, W: myW)
    }
    else {
        label.text = "Please enter your Height and Weight!"
    }
}

func GetBMI(H: Double, W: Double) -> Double {
    let height: Double = H / 100
    return  W / (height * height)
}

2 个答案:

答案 0 :(得分:3)

你可以找到一些线程来描述如何修复不能将'Double'类型的值赋给'String?',但遗憾的是这些线程可能没有指出代码中的一些不良部分。

如果我要解决所有这些问题:

@IBOutlet var heightField: UITextField! //Renamed `Height` to `heightField`
@IBOutlet var weightField: UITextField! //Renamed `Weight` to `weightField`
@IBAction func calBMI(_ sender: AnyObject) {
    if //Optional binding (using `if-let`) is the more preferred way than `!= nil` and forced unwrapping.
        let heightText = heightField.text,
        let weightText = weightField.text,
        //You should not use `(... as AnyObject).doubleValue` to convert `String` to `Double`
        //and should check if the text values are valid representation of Double
        let myH = Double(heightText),
        let myW = Double(weightText)
    {
        //This is the key point for the error "Cannot assign value of type 'Double' to 'String?'"
        label.text = String(getBMI(h: myH, w: myW)) //You need to convert `Double` to `String`
    }
    else {
        label.text = "Please enter your Height and Weight!"
    }
}

//Renamed `GetBMI(H:W:)` to `getBMI(h:w:)`
func getBMI(h: Double, w: Double) -> Double {
    let height: Double = h / 100
    return  w / (height * height)
}

有些观点:

  • 属性名称应代表内容的功能。在您的代码中,您使用heightweight作为Double值,因此您最好将UITextField命名为HeightWeightUITextField s)与其他东西。我将其重命名为heightFieldweightField

  • 使用!= nil进行测试然后应用强制解包(!)不是首选方法,您最好尽量避免使用!。更好地使用可选绑定 - if-let

  • 您不应使用(... as AnyObject).doubleValueString转换为Double。您可以使用Double的初始值设定项将String转换为Double(#1)。哪个会返回Optional<Double>,因此最好将它们包含在if-let 中。

  • 您无法直接将Double值分配给String?类型的媒体资源。您可以使用String的初始值设定项将Double转换为String(#1)

  • 在Swift中,您通常只对类型使用大写标识符,因此我将GetBMI(H:W:)重命名为getBMI(h:w:)

(#1)在StringDouble之间进行转换时使用初始值设定项是一种简化方法。制作 BMI计算器教程代码可能就足够了,但对于实际的应用程序来说可能还不够。考虑将NSNumberFormatter用于实际应用。

强烈推荐

粗线

答案 1 :(得分:1)

label.text = String(GetBMI(H: myH, W: myW)) 

您的函数返回一个double,label.text只接受一个字符串。因此,您得到的错误消息:无法将'Double'类型的值赋给'String?。

错误中的问号可能会让你失望。的?在'字符串?'是因为label.text可能是空的,所以它是一个'可选'即:可能有也可能没有值。的反面 !明确声明有一个值,并且是!= nil。