文本字段作为平均函数的输入

Textfield as input in average function

我最近想编写一个平均值计算器。 我的计划是构建一个 UITextField,您可以在其中键入以逗号分隔的数字...通过按下 'Calculate' 按钮,应用程序应计算上面数字的平均值并通过设置标签文本给出它们到平均水平。 所以我写了我的平均函数并收到了这个错误信息:

Can not convert value of type 'UITextField' to expected element type '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)"
}

你能帮我想想办法吗? 有没有更好的方法来获取输入?

您需要做的是使用 Double(Input.text) 而不是 [Input]。现在,您正试图将 UITextField 转换为双精度数,这会导致错误。

如果这样做,您需要分隔数字才能获得该数组:

您可以将 "doubles" 数组传递给平均函数

要复制粘贴的代码:)

var str = "1,2,3,4,5,6"

let stringsWithNumbers = str.componentsSeparatedByString(",")

let doubles = stringsWithNumbers.map { Double([=10=])! }

变量请使用小驼峰式大小写...

这一行:

var grades:[Double] = [Input]

InputUITextField 的实例,因此您试图将单个元素 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([=11=])}
    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([=12=])}

在 Lu_ 的回答中有很好的描述。我的只是稍微安全一点的版本。


(加法) 关于安全的一些解释:

UITextFields 属性 textString? 类型,所以你应该认为它可以是 nil。使用 ?? 运算符为 nil 提供默认值。

并且使用 Double([=25=])! 可能会使您的应用程序崩溃,因为 Double([=26=]) 对于非数字字符串 return nil。

写这些又让我想起了一个崩溃案例。

gradesTotal == 0 时,上面的代码将因被零除而崩溃。

default 值不适用于上面代码中的 "safety"...)

所以,安全又向前迈进了一步:

@IBAction func calculate(sender: AnyObject) {

    var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{
        Double([=13=].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"
    }
}
let textInput = txtInputView.text;
let components = textInput.componentsSeparatedByString(",");
let sum = 0.0;
for txt in components
{
     sum = sum + Double(txt);
}

let avg = sum / components.count;
print(avg)

如果有人感兴趣,这里是完整的代码:)

@IBOutlet var input: UITextField!
@IBOutlet var output: UILabel!
@IBAction func calculate(sender: AnyObject) {

    var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{
        Double([=10=].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"
    }

}

@IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true)
}

我添加了行 @IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true) } 以在您点击计算时关闭输入 TextField...