我是一个快速的初学者,然后想写一个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)
}
答案 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)
}
有些观点:
属性名称应代表内容的功能。在您的代码中,您使用height
和weight
作为Double
值,因此您最好将UITextField
命名为Height
和Weight
是UITextField
s)与其他东西。我将其重命名为heightField
和weightField
。
使用!= nil
进行测试然后应用强制解包(!
)不是首选方法,您最好尽量避免使用!
。更好地使用可选绑定 - if-let
。
您不应使用(... as AnyObject).doubleValue
将String
转换为Double
。您可以使用Double
的初始值设定项将String
转换为Double
(#1)。哪个会返回Optional<Double>
,因此最好将它们包含在if-let
中。
您无法直接将Double
值分配给String?
类型的媒体资源。您可以使用String
的初始值设定项将Double
转换为String
(#1)。
在Swift中,您通常只对类型使用大写标识符,因此我将GetBMI(H:W:)
重命名为getBMI(h:w:)
。
(#1)在String
和Double
之间进行转换时使用初始值设定项是一种简化方法。制作 BMI计算器教程代码可能就足够了,但对于实际的应用程序来说可能还不够。考虑将NSNumberFormatter
用于实际应用。
粗线。
答案 1 :(得分:1)
label.text = String(GetBMI(H: myH, W: myW))
您的函数返回一个double,label.text只接受一个字符串。因此,您得到的错误消息:无法将'Double'类型的值赋给'String?。
错误中的问号可能会让你失望。的?在'字符串?'是因为label.text可能是空的,所以它是一个'可选'即:可能有也可能没有值。的反面 !明确声明有一个值,并且是!= nil。