我最近想编写一个普通计算器。
我的计划是建立一个UITextField
的,你可以在其中键入由逗号分隔的数字。。。通过按下“计算”按钮,应用程序应该计算上述数字的平均值,并通过将labeltext设置为平均值来给出这些数字。
因此,我编写了平均值函数并收到以下错误消息:
无法将“UITextField”类型的值转换为所需的元素类型“Double”。
这是我的代码:
@IBOutlet var Input: UITextField!
@IBOutlet var Output: UILabel!
@IBAction func Calculate(sender: AnyObject) {
var grades:[Double] = [Input]
func average(nums: [Double]) -> Double {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
let average = total/gradesTotal
return average
}
let Average = average(grades)
Output.text = "Average: \(Average)"
}
你能帮我提个主意吗?
有没有更好的方法来获取信息?
最佳答案
请对变量使用小写形式。。。
在这一行中:
var grades:[Double] = [Input]
Input
是UITextField
的一个实例,因此您试图将单个元素Array<UITextField>
分配给Array<Double>
。你看你不能做这种事。如果要接受包含用逗号分隔的数字的文本,则需要显式地将
text
转换为[Double]
。为了简化,让我们忽略
nil
或非数值。然后您需要将代码更改为:
@IBOutlet var input: UITextField!
@IBOutlet var output: UILabel!
@IBAction func calculate(sender: AnyObject) {
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)}
func average(nums: [Double]) -> Double {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
let average = total/gradesTotal
return average
}
let averageValue = average(grades)
output.text = "Average: \(averageValue)"
}
这条线的基本思想是:
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)}
在卢的回答中有很好的描述。我的只是更安全一点。
(补充)
关于安全的一些解释:
UITextField
s属性的类型为text
,因此您应该认为它可以为零。使用String?
运算符为nil提供默认值。使用
??
可能会导致应用程序崩溃,因为对于非数字字符串,Double($0)!
将返回nil。写这些让我想起了另一个车祸案例。
当
Double($0)
==0时,上面的代码将崩溃,除法为零。(上述代码中的
gradesTotal
值对“安全”不起作用…)因此,再向前迈出一步,确保安全:
@IBAction func calculate(sender: AnyObject) {
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{
Double($0.stringByTrimmingCharactersInSet(.whitespaceCharacterSet()))
}
func average(nums: [Double]) -> Double? {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
if gradesTotal > 0 {
let average = total/gradesTotal
return average
} else {
return nil
}
}
if let averageValue = average(grades) {
output.text = "Average: \(averageValue)"
} else {
output.text = "Average not available"
}
}
关于ios - 文本字段作为平均功能中的输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38525162/