为什么我的GPA Double值在Swift中无法正常工作?

时间:2016-06-18 04:44:57

标签: ios iphone swift swift2 ios9

为什么当我第一次使用addA时,这段代码不起作用,但是当它应该保持在4.0时,它会变为2.66并从那里继续下去。

$items = DB::table('items')
        ->join('stock_item','stock_item.stm_id','=','items.item_id')
        ->select('stock_item.stm_id','stock_item.item_name','items.id','items.status','items.quantity')
        ->distinct('items.item_id')
        ->where('items.quantity','>', 0)->where('status','0')->get();

有人可以帮助我把它放在游乐场并在它下面添加相同的按钮代码,它可以工作,但在项目中它不起作用。这让我相信问题在于addA和subtractA按钮。

2 个答案:

答案 0 :(得分:1)

您正在编写具有副作用的函数(修改外部变量)。尽量避免这种情况。此外,您可能希望在程序中使用更多结构。将gradesQuantity的位置值与字母等级相关联即可,但您可以使用词典做得更好:

enum GradeLetter: Double {
    case A = 4.0
    case AMinus = 3.7
    case BPlus = 3.3
    case B = 3
    case BMinus = 2.7
    case CPlus = 2.3
    case C = 2
    case CMinus = 1.7
    case DPlus = 1.3
    case D = 1
    case DMinus = 0.7
    case F = 0
}

func calculateGPA(grades: [GradeLetter: Int]) -> Double {
    let courseCount = grades.reduce(0.0) { aggregate, grade in
        return aggregate + Double(grade.1)
    }
    let totalPoint = grades.reduce(0.0) { aggregate, grade in
        return aggregate + grade.0.rawValue * Double(grade.1)
    }

    return totalPoint / courseCount
}

我们假设你有1 A,2 A-和3 B

var grades = [GradeLetter: Int]()
grades[.A] = 1
grades[.AMinus] = 2
grades[.B] = 3

print(calculateGPA(grades))

答案 1 :(得分:0)

我认为你问题的根本原因是你做了太多工作。如果您删除了addGrades功能(实际上并没有真正添加任何功能)并使用以下内容替换您的AddASubtractA功能,那么它将作为意:

@IBAction func AddA() {
    gradesQuantity[0] += 1.0
    gradesAdded += 1.0
    GPANumber.text = String(calcGPA(gradesQuantity))
    AQuantity.text = String(Int(gradesQuantity[0]))
}

@IBAction func SubtractA() {
    gradesQuantity[0] -= 1.0
    gradesAdded -= 1.0
    GPANumber.text = String(calcGPA(gradesQuantity))
    AQuantity.text = String(Int(gradesQuantity[0]))
}

为了进一步开发,我建议创建一个子类数组,它具有添加和减去成绩并返回GPA的功能。这应该使事情更具可读性和可重用性。