Swift3 如何修复无法分配类型为';的值;双倍';至';字符串?';迅捷3

Swift3 如何修复无法分配类型为';的值;双倍';至';字符串?';迅捷3,swift3,Swift3,我是一个快速的初学者,然后想写一个体重指数计数 错误无法将“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 Any

我是一个快速的初学者,然后想写一个体重指数计数

错误无法将“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)
}

您可以发现一些描述如何修复的线程无法将类型为“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)
}
有几点:

  • 属性名称应表示内容的功能。在代码中,使用
    height
    weight
    作为
    Double
    值,因此最好将
    UITextField
    s(假设
    height
    weight
    UITextField
    s)与其他名称一起命名。我将它们重命名为
    heightField
    weightField

  • 使用
    进行测试!=nil
    然后应用强制展开(
    )不是首选方法,您最好避免使用
    尽可能多。如果让
    ,最好使用可选绑定--

  • 您不应使用
    (…作为任何对象)。doubleValue
    字符串
    转换为
    Double
    。您可以使用
    Double
    的初始值设定项将
    String
    转换为
    Double
    (#1)。它返回
    可选的
    ,因此如果让它们
    ,最好将它们包含在

  • 不能直接将
    Double
    值分配给
    String?
    类型的属性。您可以使用
    String
    的初始值设定项将
    Double
    转换为
    String
    (#1)

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

(#1)在
String
Double
之间转换时使用初始值设定项是一种简化的方法。它可能足以制作BMI计算器教程代码,但可能不足以用于实际应用程序。考虑在实际应用程序中使用<代码> NSNumberFormatter <代码>。< /P>
粗体行是必需的或强烈建议的。

您可以找到一些描述如何修复的线程无法将类型为“Double”的值分配给“String”,但不幸的是,这些线程可能没有指出代码中的一些不好的部分

label.text = String(GetBMI(H: myH, W: myW)) 
如果我要修复所有这些部件:

@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)
}
有几点:

  • 属性名称应表示内容的功能。在代码中,使用
    height
    weight
    作为
    Double
    值,因此最好将
    UITextField
    s(假设
    height
    weight
    UITextField
    s)与其他名称一起命名。我将它们重命名为
    heightField
    weightField

  • 使用
    进行测试!=nil
    然后应用强制展开(
    )不是首选方法,您最好避免使用
    尽可能多。如果让
    ,最好使用可选绑定--

  • 您不应使用
    (…作为任何对象)。doubleValue
    字符串
    转换为
    Double
    。您可以使用
    Double
    的初始值设定项将
    String
    转换为
    Double
    (#1)。它返回
    可选的
    ,因此如果让它们
    ,最好将它们包含在

  • 不能直接将
    Double
    值分配给
    String?
    类型的属性。您可以使用
    String
    的初始值设定项将
    Double
    转换为
    String
    (#1)

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

(#1)在
String
Double
之间转换时使用初始值设定项是一种简化的方法。它可能足以制作BMI计算器教程代码,但可能不足以用于实际应用程序。考虑在实际应用程序中使用<代码> NSNumberFormatter <代码>。< /P> 必须或强烈建议使用粗体线条

label.text = String(GetBMI(H: myH, W: myW)) 
函数返回一个double,label.text将只接受一个字符串。因此,您会收到错误消息:无法将“Double”类型的值分配给“String”

错误中的问号可能会把你甩了。这个因为label.text可能为空,所以它是“可选”的,即:可能有值,也可能没有值。相反的!它明确声明存在一个值,并且是!=零

函数返回一个double,label.text将只接受一个字符串。因此,您会收到错误消息:无法将“Double”类型的值分配给“String”

错误中的问号可能会把你甩了。这个因为label.text可能为空,所以它是“可选”的,即:可能有值,也可能没有值。相反的!它明确声明存在一个值,并且是!=零