SWIFT 4 - 无法将类型 'UITextField!' 的值转换为预期的参数类型 'Double'

SWIFT 4 - Cannot convert value of type 'UITextField!' to expected argument type 'Double'

我正在尝试创建这个基本的地球曲率公式,我让它在操场上工作,但我很难从 UITextField 获取距离,从字符串类型的故事板到 Double 所以它可以进行计算。我试过 downcasting 等,但仍然无法正常工作。

class ViewController: UIViewController {

// MARK: - IBOutlets

@IBOutlet weak var distanceTextField: UITextField! // Distance from point A to B in miles from textField
@IBOutlet weak var targetHiddenInFeet: UILabel! // Result of earth curvature formula displayed in Label

// MARK: - Variables and Contsants

let inchPerMile : Double = 8 // inch drop per mile (Never changes)


// MARK: - IBActions

@IBAction func calculateButtonPressed(_ sender: UIButton) {

let distanceSquared : Double = pow(distanceTextField,2)
let curvatureFormula : Double = inchPerMile * distanceSquared
let convertionInFeet : Double = curvatureFormula / 12
let roundedNumber = String(format: "%.2f", convertionInFeet)

    print(roundedNumber)
    return targetHiddenInFeet.text = roundedNumber

}

您必须先从 TextField 中获取文本

distanceTextField.text

然后要将其转换为 double,您可以像这样使用类型初始化程序

Double(distanceTextField.text)

所以读作

的那一行
let distanceSquared : Double = pow(distanceTextField,2)

会变成

let distanceSquared : Double = pow(Double(distanceTextField.text), 2)

如果输入的文本无法转换为 Double,此初始化可能会失败,因此以下代码将提供安全性

if let distance = Double(distanceTextField.text!) {
  let distanceSquared : Double = pow(distance, 2)
} else {
  //failed to convert textfield text to a double
}

主要错误是您试图将 UITextField 对象转换为数字,但您必须通过 text accessor 从文本输入中获取值。像这样 let distanceSquared : Double = pow(distanceTextField.text, 2).

其次,text 属性 是可选的,因此最好检查您是否有值,例如 guard 语句。在 func calculateButtonPressed(...) 开头的 guard let distance = distanceTextField.text else { return } 类似这样的内容。在输入为空的情况下,你的函数将不会被执行(通常它被称为'early return')。

第三,检查文本是否为实数是个好习惯(Double function returns optional value if you pass String and it's nil如果输入不是数字),那么最终的解决方案可能如下所示:

@IBAction func calculateButtonPressed(_ sender: UIButton) {
    guard let distance = Double(distanceTextField.text) else { return }
    let distanceSquared : Double = pow(distance, 2)
    let curvatureFormula : Double = inchPerMile * distanceSquared
    let convertionInFeet : Double = curvatureFormula / 12
    let roundedNumber = String(format: "%.2f", convertionInFeet)

    print(roundedNumber)
    targetHiddenInFeet.text = roundedNumber
}

P.S。另外,我删除了函数末尾的 return 语句,因为它不是必需的(默认情况下你的函数 return Void)。

编码愉快!