如何用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("没有有效学生分数数据") }
原代码的核心错误分析
- 函数返回类型缺失:原函数未指定返回类型却尝试返回值,违反Swift语法规则。正确做法是定义可选元组
(name: String, score: Int)?作为返回类型,应对字典为空的场景。 - 字典遍历与取值错误:遍历
studentsAndScores.values后用studentsAndScores[value]取值完全错误——字典的键是String类型,不能用Int类型的分数作为键。应直接遍历字典的键值对(name, score)。 - 硬编码最高分:原代码固定判断分数是否为99,不符合“适配所有分数情况”的要求,需动态遍历计算最高分。
- 强制解包风险:原代码用
!强制解包readLine()和Int转换,一旦输入非数字或为空会直接崩溃,需用flatMap或if let安全处理可选类型。 - 参数未正确使用:函数内直接调用全局变量
studentsAndScores而非传入的scores参数,破坏了函数的封装性和复用性。
关键特性说明
- 可选类型处理:用
flatMap处理输入的可选值,用可选元组作为函数返回值,确保代码在空字典、无效输入场景下不会崩溃。 - 动态计算最高分:初始化
maxScore为Int.min(整数最小值),确保任何有效分数都能触发更新,适配所有可能的分数范围。 - 安全解包:调用函数时用
if let解包可选结果,分别处理有数据和无数据的输出逻辑。
内容的提问来源于stack exchange,提问作者Jonathan Rodgers
相关产品推荐
相关产品推荐

