[swift]作为平均函数中的输入文本字段

发布时间: 2017/3/6 23:32:50
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我最近想要代码平均计算器。 我的计划是建造 UITextField 中,您可以键入用逗号分隔的数字......按下计算按钮应用程序应该计算平均值的上面的数字,给他们通过设置 labeltext 的平均水平。 所以我写了我的 average 函数,并收到此错误消息︰

不能转换预期的元素类型 '双' 'UITextField' 类型的值。

这是我的代码︰

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

你可以帮我与我的想法吗? 有更好的方式来得到一个输入吗?

解决方法 1:

请使用较低的 camel 大小写变量...

在下面这行︰

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

是良好的描述在 Lu_ 的答案。我的只是一点点安全版本。


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

UITextFields 属性 text 的类型是 String? ,所以你应该认为它可为零。默认值为零与 ?? 运算符。

使用 Double($0)! 可能会崩溃,您的应用程序,作为 Double($0) 将返回零非数字字符串。

写这些让我想起一个更多的车祸案。

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"
    }
}
赞助商