Ios 如何在函数外更改字典中的双精度值?
有没有一种方法可以让分数[“a”]+=1.0这样它就上升一级,我就可以调用calcGPA()?我不知道该怎么做。这方面的任何帮助都将非常棒您可以通过强制展开查找来增加词典中的值: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
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