Swift中如何简化冗长多层嵌套的if else条件判断语句
冗余if-else分支重构方案
核心思路是用数据配置映射替代硬编码条件判断,把分散在各个分支里的UI赋值规则抽成结构化配置,运行时直接匹配配置赋值,彻底消除嵌套分支。
第一步:定义配置模型
先把每个分支里零散的UI属性封装成统一模型,避免赋值逻辑散落在各处:
// 单天对应的所有UI属性配置 struct DayConfig { let day: Int let dayOrdinal: String // 1st/2nd/3rd这类序数文本 let isTestLabelHidden: Bool let isSubjectLabelHidden: Bool let subjectText: String? let unitText: String? let titleText: String } // 老师数+学生数组合对应的全量天数配置 struct SceneConfig { let teacherCount: Int let studentCount: Int let dayMap: [Int: DayConfig] // key为实际天数 = interval.day! + 1 }
第二步:集中维护所有规则
把所有判断分支的规则统一放到配置表里,你现在已经写好的(4,27)场景直接填入,其他空分支后续补内容只需要加配置条目,不需要写判断逻辑:
let configRepository: [SceneConfig] = [ SceneConfig( teacherCount: 4, studentCount: 27, dayMap: [ 1: DayConfig( day: 1, dayOrdinal: "1st", isTestLabelHidden: true, isSubjectLabelHidden: false, subjectText: "Physics", unitText: nil, titleText: "Today is your first day" ), 2: DayConfig( day: 2, dayOrdinal: "2nd", isTestLabelHidden: true, isSubjectLabelHidden: false, subjectText: "Chemistry", unitText: nil, titleText: "Today is your Second day" ), 3: DayConfig( day: 3, dayOrdinal: "3rd", isTestLabelHidden: true, // 原代码未显式设置该值,可按实际业务调整 isSubjectLabelHidden: true, subjectText: nil, unitText: "Mathematics", titleText: "Today is your Third day" ), 4: DayConfig( day: 4, dayOrdinal: "4th", isTestLabelHidden: false, isSubjectLabelHidden: false, subjectText: "Physics", unitText: nil, titleText: "Today is your fourth day" ) ] ), // 其余(4,28)、(4,29)...(7,30)场景,直接在此处追加SceneConfig条目即可 ]
第三步:替换原有分支逻辑
原来几十上百行的嵌套if-else,直接替换成几行配置查找+统一赋值的代码:
// 直接用Int类型计算天数,避免无意义的字符串转换,匹配效率更高 let currentDay = interval.day! + 1 // 查找匹配的配置 guard let targetScene = configRepository.first(where: { $0.teacherCount == numberOfTeachers && $0.studentCount == numberOfStudents }), let targetDayConfig = targetScene.dayMap[currentDay] else { // 无匹配配置的兜底逻辑,按需实现即可 return } // 统一给UI控件赋值 daysLabel.text = targetDayConfig.dayOrdinal testLabel.isHidden = targetDayConfig.isTestLabelHidden subjectLabel.isHidden = targetDayConfig.isSubjectLabelHidden subjectLabel.text = targetDayConfig.subjectText unitLabel.text = targetDayConfig.unitText dayTitleLabel.text = targetDayConfig.titleText
方案优势
- 维护成本极低:所有文案、显隐规则集中在配置表管理,修改规则、新增场景/天数时不需要动核心赋值逻辑,不会出现分支漏写、判断条件写错的问题
- 性能更好:去掉了多余的字符串类型转换,直接用Int值做匹配,避免字符串比较的额外开销
- 扩展性强:后续如果规则变多,甚至可以把配置表改成从本地JSON文件读取,不需要发版就能更新内容;序数词也可以抽工具方法自动生成,不需要手动填写1st/2nd这类文本。
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

