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

问题描述 投票:0回答:2

我正在尝试创建这个基本的地球曲率公式,我让它在游乐场工作,但我很难从UITextField获得距离,从类型为string的故事板到Double,因此可以计算。我尝试过向下转换等等,仍然无法让它发挥作用。

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

}

Press for Screenshot

swift formula calculator trigonometry
2个回答
0
投票

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

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

第三,检查文本是否为实数是一个好习惯(Double function如果传递String则返回可选值,如果输入不是数字则返回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
}

附:另外,我在函数末尾删除了return语句,因为它没有必要(你的函数默认返回Void)。

快乐的编码!


2
投票

您必须首先从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
}
© www.soinside.com 2019 - 2024. All rights reserved.