首页 > 解决方案 > 我如何获得表格视图(swift)中分数的平均值?

问题描述

我想显示输入到实体中的所有值的平均值。基本上,人们会在 TableView 上按添加,然后会出现一个弹出窗口询问分数,然后将“考试”添加到 tableview。我希望能够将所有分数相加并获得它们的平均值,然后我可以将其添加到标签中。我试过遵循其他一些教程,但它给了我一个错误。

https://i.stack.imgur.com/P7exB.jpg https://i.stack.imgur.com/WWITI.jpg

上面的图片是为了上下文。

var i = 0
var sum = 0

    for i in 0...methodsExam.count {
        let title = methodsExam[i]
        let str : String = title.value(forKey: "score") as! String
        sum = sum + Int(str)!
    }
    let avg = sum/methodsExam.count
    
    averageScore.text = "Average: \(avg)"

标签: swiftxcodecore-datatableviewxcode12

解决方案


假设methodsExam是 [MethodsExam] 数组,您可以将循环更改为

var sum = 0.0
for item in methodsExam {
    if let scoreStr = item.score, let score = Double(scoreStr) {
        sum += score
    }
}
let average = sum / Double(methodsExam.count)

我在这里使用 Double 以获得更高的精度。

这也可以通过高阶函数来完成

let average = methodsExam.reduce(into: 0.0) {
    if let scoreStr = $1.score, let score = Double(scoreStr) { $0 += score }
} / Double(methodsExam.count)

由于我们要除以数组计数,我们还必须检查数组不为空以避免被 0 除,因此我们可以将代码放入函数中并执行此操作

func calculateAverage(_ array: [MethodsExam]) -> Double {
    guard !array.isEmpty else { return 0.0 }

    return  array.reduce(into: 0.0) {
        if let scoreStr = $1.score, let score = Double(scoreStr) { $0 += score }
    } / Double(array.count)
}

一个警告,我假设它score可以是 nil 因为 MethodsExam 是一个 NSManagedObject 而不是因为它会保存 nil 值。如果它确实可以保存 nil 值,那么您需要考虑计算平均值,数组中的所有值或仅非 nil 值。


推荐阅读