如何无需编写大量if语句,根据int值匹配对应字符串?
实现方案
直接用映射表替换所有if判断即可,13种取值和10个label的场景下完全可以把代码量控制在几十行以内,且后续维护成本极低。
- 首先定义Int到等级字符串的映射字典,13种对应关系一次定义,全项目可复用:
let gradeMapping: [Int: String] = [ 1: "A+", 2: "A", 3: "A-", 4: "B+", 5: "B", 6: "B-", // 剩余的对应关系按你的实际需求补全即可 13: "F" ]
- 单个label赋值时无需任何判断,一行代码完成转换,找不到对应取值时可以设置默认值避免崩溃:
class1LetterGrade = gradeMapping[class1Grade] ?? "未评级"
- 如果10个label需要同时赋值,可以把对应成绩和label打包成数组批量处理,连重复的赋值代码都可以省掉:
// 按你的实际业务把10组成绩、对应label整理为数组 let gradeLabelPairs: [(grade: Int, label: UILabel)] = [ (class1Grade, class1LetterLabel), (class2Grade, class2LetterLabel), (class3Grade, class3LetterLabel), // 剩余7组按实际情况补全 ] // 循环批量完成所有label的内容赋值 gradeLabelPairs.forEach { $0.label.text = gradeMapping[$0.grade] ?? "未评级" }
可选优化:如果你的13个Int取值是从1到13连续无断档,也可以用数组做映射,性能和字典基本一致:
// 下标0做占位,对应1~13的取值直接取下标1~13的内容 let gradeArray: [String] = ["", "A+", "A", "A-", "B+", ... , "F"] class1LetterGrade = gradeArray[class1Grade]更推荐使用字典方案,容错性更高,后续如果取值规则调整不需要改动顺序,也不会出现数组越界崩溃的问题,完全符合你要求的原始值保留Int类型的要求,UIPicker返回的Int值可以直接使用无需转换。
内容的提问来源于stack exchange,提问作者Cooper H
相关产品推荐
相关产品推荐

