请使用较低的骆驼情况变量...
在这一行:
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)"
}
这一行的基本思路:在Lu_的答案
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)}
是很好的描述。我的只是一个更安全的版本。
(加) 关于安全的一些说明:
UITextField
财产text
是String?
类型的,所以你应该认为它可以是零。使用??
运算符为零提供默认值。
而使用Double($0)!
可能会导致您的应用程序崩溃,因为Double($0)
将针对非数字字符串返回nil。
写这些让我想起了另一个崩溃案例。
当gradesTotal
== 0时,上面的代码将会被零除。
(该default
值不会在上面的代码中的“安全” ......不错的选择)
所以,提前一个步骤安全:
@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"
}
}
使用'Double(Input.text)'。你现在正在指定textfield对象加倍 –