Textfield作为平均函数的输入

时间:2016-07-22 11:21:09

标签: ios objective-c swift func

我最近想编写一个平均值计算器。 我的计划是构建一个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)"
}
你可以帮我解释一下这个想法吗? 有没有更好的方式来获得输入?

5 个答案:

答案 0 :(得分:6)

如果您这样做,您需要分隔数字以获取该数组: enter image description here

你可以通过"双打"数组到你的平均函数

代码到copypaste:)

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

let stringsWithNumbers = str.componentsSeparatedByString(",")

let doubles = stringsWithNumbers.map { Double($0)! }

答案 1 :(得分:2)

请使用较低的驼峰案例作为变量...

在这一行:

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($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)}

在Lu的回答中得到了很好的描述。我只是一个更安全的版本。

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

UITextField属性text的类型为String?,因此您应该认为它可以为零。使用??运算符为nil提供默认值。

使用Double($0)!可能会导致您的应用崩溃,因为对于非数字字符串,Double($0)将返回nil。

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

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

default值对于上面的代码中的&#34; safety&#34;效果不佳...)

所以,再向安全迈进一步:

@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"
    }
}

答案 2 :(得分:0)

您需要做的是使用Double(Input.text)代替[Input]。现在,您试图将UITextField转换为double,这会导致错误。

答案 3 :(得分:0)

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)

答案 4 :(得分:0)

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

@IBOutlet var input: UITextField!
@IBOutlet var output: UILabel!
@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"
    }

}

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

当您点按计算...

时,我添加了行@IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true) }以关闭输入的TextField