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

如何用Swift遍历字典找出最高分学生及分数并处理可选类型?

解决方案:Swift 实现字典中最高分学生的查找(处理可选类型)

修正后的完整代码

// 安全读取输入,处理可选类型,避免强制解包崩溃
var studentsAndScores: [String: Int] = [:]
if let amyScore = readLine().flatMap(Int.init) {
    studentsAndScores["Amy"] = amyScore
}
if let jamesScore = readLine().flatMap(Int.init) {
    studentsAndScores["James"] = jamesScore
}
if let helenScore = readLine().flatMap(Int.init) {
    studentsAndScores["Helen"] = helenScore
}

// 定义函数,返回可选元组(处理空字典情况)
func highestScore(scores: [String: Int]) -> (name: String, score: Int)? {
    guard !scores.isEmpty else {
        return nil
    }
    
    var maxScore = Int.min
    var topStudent = ""
    
    for (name, score) in scores {
        if score > maxScore {
            maxScore = score
            topStudent = name
        }
    }
    
    return (topStudent, maxScore)
}

// 调用函数并处理可选结果
if let result = highestScore(scores: studentsAndScores) {
    print("最高分学生:\(result.name),分数:\(result.score)")
} else {
    print("没有有效学生分数数据")
}

原代码的核心错误分析

  1. 函数返回类型缺失:原函数未指定返回类型却尝试返回值,违反Swift语法规则。正确做法是定义可选元组(name: String, score: Int)?作为返回类型,应对字典为空的场景。
  2. 字典遍历与取值错误:遍历studentsAndScores.values后用studentsAndScores[value]取值完全错误——字典的键是String类型,不能用Int类型的分数作为键。应直接遍历字典的键值对(name, score)。
  3. 硬编码最高分:原代码固定判断分数是否为99,不符合“适配所有分数情况”的要求,需动态遍历计算最高分。
  4. 强制解包风险:原代码用!强制解包readLine()和Int转换,一旦输入非数字或为空会直接崩溃,需用flatMap或if let安全处理可选类型。
  5. 参数未正确使用:函数内直接调用全局变量studentsAndScores而非传入的scores参数,破坏了函数的封装性和复用性。

关键特性说明

  • 可选类型处理:用flatMap处理输入的可选值,用可选元组作为函数返回值,确保代码在空字典、无效输入场景下不会崩溃。
  • 动态计算最高分:初始化maxScore为Int.min(整数最小值),确保任何有效分数都能触发更新,适配所有可能的分数范围。
  • 安全解包:调用函数时用if let解包可选结果,分别处理有数据和无数据的输出逻辑。

内容的提问来源于stack exchange,提问作者Jonathan Rodgers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:45:32