Swift大学绩点计算器开发:如何用函数简化8门课程重复代码?
Swift绩点计算器代码简化方案
针对你需要处理8门课程计算、避免重复代码的需求,我们可以通过抽离复用逻辑+数组批量管理彻底简化代码:
1. 把成绩转绩点的逻辑抽成独立函数
把一堆if判断换成更简洁的switch,写成单独函数,哪里需要哪里调用:
func gradePoint(for letterGrade: String) -> Double { switch letterGrade.uppercased() { case "AA": return 4.0 case "BA": return 3.5 case "BB": return 3.0 case "CB": return 2.5 case "CC": return 2.0 case "DC": return 1.5 case "DD": return 1.0 case "FF": return 0.0 default: return 0.0 // 处理无效成绩输入 } }
2. 封装单门课程的计算逻辑
写一个函数专门处理单门课的学分×绩点计算,同时处理空输入、无效数字等情况,不用每次重复写解包和判断:
func courseWeightedScore(creditField: UITextField, gradeField: UITextField) -> Double { // 校验学分是否有效 guard let creditStr = creditField.text, let credit = Double(creditStr), credit > 0 else { return 0.0 } // 获取有效成绩对应的绩点 guard let gradeStr = gradeField.text else { return 0.0 } let point = gradePoint(for: gradeStr) return point * credit }
3. 用数组批量管理所有课程输入框
把8门课的学分、成绩输入框配对存到数组里,循环一遍就能处理所有课程,不用写8次相同代码:
首先在ViewController里声明数组:
// 存储所有课程的(学分输入框, 成绩输入框) var coursePairs: [(credit: UITextField, grade: UITextField)] = []
然后在viewDidLoad里把你的8组输入框加进去(替换成你实际的IBOutlet):
override func viewDidLoad() { super.viewDidLoad() coursePairs = [ (firstSectionCredit, firstSectionGrade), (secondSectionCredit, secondSectionGrade), (thirdSectionCredit, thirdSectionGrade), // ... 剩下5组依次添加 ] }
4. 简化计算按钮的逻辑
现在calculate方法里只需要循环数组,累加总分和总学分,最后算出绩点:
@IBAction func calculate(_ sender: Any) { var totalWeightedScore = 0.0 var totalCredits = 0.0 for pair in coursePairs { // 累加单门课的加权分数 totalWeightedScore += courseWeightedScore(creditField: pair.credit, gradeField: pair.grade) // 累加有效学分 if let creditStr = pair.credit.text, let credit = Double(creditStr), credit > 0 { totalCredits += credit } } // 计算最终绩点,避免除以0的情况 let gpa = totalCredits > 0 ? totalWeightedScore / totalCredits : 0.0 // 格式化显示到标签,保留两位小数 ortalamaLabel.text = String(format: "%.2f", gpa) }
额外提示
- 可以给学分输入框设置
keyboardType = .decimalPad,方便输入数字 - 给成绩输入框加输入限制,只允许输入AA/BA等指定字符串,避免无效输入
- 删掉原来的
firstNumberGrade、sonuc1这类零散变量,用上面的函数和数组统一管理即可
内容的提问来源于stack exchange,提问作者İbrahim Bayram
相关产品推荐
相关产品推荐

