You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:55:20