我正在尝试创建这个基本的地球曲率公式,我让它在游乐场工作,但我很难从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
}
主要的错误是你试图将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
)。
快乐的编码!
您必须首先从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
}