我最近想编写一个普通计算器。
我的计划是建立一个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]

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

在卢的回答中有很好的描述。我的只是更安全一点。
(补充)
关于安全的一些解释:
UITextFields属性的类型为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/

10-12 00:15
查看更多