Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在函数外更改字典中的双精度值?_Ios_Swift_Function_Dictionary_Swift2 - Fatal编程技术网

Ios 如何在函数外更改字典中的双精度值?

Ios 如何在函数外更改字典中的双精度值?,ios,swift,function,dictionary,swift2,Ios,Swift,Function,Dictionary,Swift2,有没有一种方法可以让分数[“a”]+=1.0这样它就上升一级,我就可以调用calcGPA()?我不知道该怎么做。这方面的任何帮助都将非常棒您可以通过强制展开查找来增加词典中的值: var grades: [String : Double] grades = ["A": 0.0, "A-": 0.0, "B+": 0.0, "B": 0.0, "B-": 0.0, "C+": 0.0, "C": 0.0, "C-": 0.0, "D+": 0.0, "D": 0.0, "D-": 0.0, "F

有没有一种方法可以让分数[“a”]+=1.0这样它就上升一级,我就可以调用calcGPA()?我不知道该怎么做。这方面的任何帮助都将非常棒

您可以通过强制展开查找来增加词典中的值:

var grades: [String : Double]

grades = ["A": 0.0, "A-": 0.0, "B+": 0.0, "B": 0.0, "B-": 0.0, "C+": 0.0, "C": 0.0, "C-": 0.0, "D+": 0.0, "D": 0.0, "D-": 0.0, "F": 0.0]

func calcGPA() {

if let a = grades["A"], amin = grades["A-"], bplu = grades["B+"], b = grades["B"], bmin = grades["B-"], cplu = grades["C+"], c = grades["C"], cmin = grades["C-"], dplu = grades["D+"], d = grades["D"],    dmin = grades["D-"], f = grades["F"] {

        // Divide by this
        let gradesAdded = a + amin + bplu + b + bmin + cplu + c + cmin + dplu + d + dmin + f
        //grades multiplied by their values and added ex. a * 4.0 + amin * 3.7
        let gradesCalculated = a * 4.0 + amin * 3.7 + bplu * 3.3 + b * 3.0 + bmin * 2.7 + cplu * 2.3 + c *  2.0 + cmin * 1.7 + dplu * 1.3 + d * 1.0 + dmin * 0.7 // Dont do F because it would just add 0
        var gpa = gradesCalculated / gradesAdded

        if gpa.isNaN {
            gpa = 0.0
        }
    }
}
但这是危险的,因为如果钥匙不在字典中,它会崩溃。因此,您应该检查:

grades["A"]! += 1.0
以下是您的程序的更新版本:

if let count = grades["A"] {
    grades["A"] = count + 1
}

笔记:
  • 我将您的函数更改为获取等级数组并返回一个
    Double?
    (可选
    Double
  • 如果出现任何错误,则返回
    nil
    (输入数组为空,输入数组包含无效等级,如“E”)
  • 通过在计算之前检查除数,可以提前避免被零除

  • 替代解决方案: 现在是完全不同的事情

    受@CodeBender评论的启发,以下是一个使用
    enum
    和关联值表示等级的实现:

    func calcGPA(_ termGrades: [String]) -> Double? {
    
        var grades: [String: Double] = ["A": 0.0, "A-": 0.0, "B+": 0.0, "B": 0.0, "B-": 0.0, "C+": 0.0, "C": 0.0, "C-": 0.0, "D+": 0.0, "D": 0.0, "D-": 0.0, "F": 0.0]
    
        var gpa: Double?
        
        for grade in termGrades {
            if let count = grades[grade] {
                grades[grade] = count + 1
            } else {
                print("Hmmm, \(grade) is not a valid value for a grade")
                return nil
            }
        }
        
        if let a = grades["A"], amin = grades["A-"], bplu = grades["B+"], b = grades["B"], bmin = grades["B-"], cplu = grades["C+"], c = grades["C"], cmin = grades["C-"], dplu = grades["D+"], d = grades["D"], dmin = grades["D-"], f = grades["F"] {
            
            // Divide by this
            let gradesAdded = a + amin + bplu + b + bmin + cplu + c + cmin + dplu + d + dmin + f
            //grades multiplied by their values and added ex. a * 4.0 + amin * 3.7
            let gradesCalculated = a * 4.0 + amin * 3.7 + bplu * 3.3 + b * 3.0 + bmin * 2.7 + cplu * 2.3 + c *  2.0 + cmin * 1.7 + dplu * 1.3 + d * 1.0 + dmin * 0.7 // Dont do F because it would just add 0
    
            gpa = gradesAdded == 0 ? nil : gradesCalculated / gradesAdded
        }
        return gpa
    }
    
    // example calls
    calcGPA(["E"])             // nil  "Hmmm, E is not a valid value for a grade"
    calcGPA(["A-"])            // 3.7
    calcGPA(["A", "B"])        // 3.5
    calcGPA(["B", "B+", "A-"]) // 3.333333333333333
    calcGPA([])                // nil
    

    看看Swift中的运算符重载。这里有一个参考:我建议删除整个字典,用枚举替换它。您可以获得类型安全性,也可以将值分配给它&然后引用enum原始值(例如:Grade.A.rawValue),我同意@CodeBender。我试图保持问题的精神,但引入enum是一个很好的方法。谢谢你的帮助,我真的很感激
    reduce
    是一个迭代集合(数组)值的函数
    reduce
    接受两个参数:初始值和对每个项运行的闭包。在这里,我用它来产生等级之和。它的工作原理是这样的:对于数组中的第一个等级,
    0.0
    作为
    total
    的初始值传递给闭包,
    grade
    接收数组中的第一个项目。闭包获取等级的
    rawValue
    ,并将其添加到当前运行的
    total
    中,然后返回该值。然后将该总数与数组中的第二级一起传递到闭包中;对于termGrades{total+=grade.rawValue}中的等级。
    enum Grade: Double {
        case A = 4.0
        case Aminus = 3.7
        case Bplus = 3.3
        case B = 3.0
        case Bminus = 2.7
        case Cplus = 2.3
        case C = 2.0
        case Cminus = 1.7
        case Dplus = 1.3
        case D = 1.0
        case Dminus = 0.7
        case F = 0
    }
    
    func calcGPA(_ termGrades: [Grade]) -> Double? {
        if termGrades.count == 0 {
            return nil
        } else {
            let total = termGrades.reduce(0.0) { (total, grade) in total + grade.rawValue }
            return total / Double(termGrades.count)
        }
    }
    
    // example calls
    calcGPA([.A, .B])              // 3.5
    calcGPA([.B, .Bplus, .Aminus]) // 3.3333333333
    calcGPA([.A, .A, .Bplus])      // 3.7666666666
    calcGPA([.F, .F, .F])          // 0
    calcGPA([])                    // nil