Swift 如何实现可扩展的数组整除规则打印方案
高可扩展规则打印实现方案
原有硬编码if-else互斥判断的写法,每新增1条规则就要新增成倍的组合分支,维护成本会随规则数量指数上升。核心优化思路是将规则定义和匹配逻辑完全解耦,不需要手动编写多规则组合的判断分支,匹配到的规则对应字符自动拼接即可。
核心实现逻辑
我们把每条规则拆成「匹配条件」+「对应输出字符」两个部分,统一存在规则列表中:
- 遍历数字时,逐个检查所有规则,只要满足匹配条件就把对应字符追加到结果中
- 如果最终拼接的结果为空,说明没匹配到任何规则,直接输出原数字
- 所有多规则同时命中的组合场景(比如同时被4/5/8整除)会自动拼接出对应结果,不需要单独写分支判断
基础版(仅支持整除规则,配置最简单)
// 规则配置区:新增/修改规则仅需改动这部分,核心逻辑无需调整 // 注意:规则在数组中的顺序就是最终输出字符的拼接顺序 let divideRules: [(divisor: Int, output: String)] = [ (4, "A"), (5, "B"), (8, "C") // 未来新增整除规则,比如被3整除输出"D",直接在这里加一行 (3, "D") 即可 ] for number in 1...100 { var printContent = "" for rule in divideRules { if number.isMultiple(of: rule.divisor) { printContent.append(rule.output) } } // 无匹配规则输出原数字,否则输出拼接结果 print(printContent.isEmpty ? number : printContent) }
这个版本运行后,会自动符合你提的组合规则要求:
- 仅被4整除输出
A - 仅被5整除输出
B - 同时被4、8整除输出
AC(注:数学上8的倍数必然是4的倍数,不存在仅被8整除不被4整除的整数,和你描述的规则完全一致) - 同时被4、5整除输出
AB - 同时被5、8整除输出
BC - 同时被4、5、8整除输出
ABC
进阶版(支持任意复杂规则)
如果后续需要新增非整除类的规则(比如数字大于90输出特殊标记、是偶数输出特殊字符等),可以把规则抽象成结构体,用闭包自定义匹配逻辑,扩展性更强:
// 通用规则结构体,支持任意匹配逻辑 struct PrintRule { let isMatch: (Int) -> Bool let output: String } // 规则配置区 let rules: [PrintRule] = [ PrintRule(isMatch: { $0.isMultiple(of: 4) }, output: "A"), PrintRule(isMatch: { $0.isMultiple(of: 5) }, output: "B"), PrintRule(isMatch: { $0.isMultiple(of: 8) }, output: "C"), // 举个例子:新增规则 数字大于90 输出"*",直接加下面这行即可 // PrintRule(isMatch: { $0 > 90 }, output: "*") ] for number in 1...100 { let result = rules.reduce("") { partialRes, rule in rule.isMatch(number) ? partialRes + rule.output : partialRes } print(result.isEmpty ? number : result) }
方案优势
- 新增规则零侵入:不管加多少条规则,都只需要在规则配置数组里新增条目,不需要改动核心遍历、匹配逻辑,不会引入老逻辑故障
- 自动支持所有组合:N条规则天然支持2^N种组合场景,完全不需要手动编写多条件同时满足的判断分支
- 输出顺序可控:调整规则在数组中的排列顺序,就能直接调整最终输出字符的拼接顺序,不需要改判断逻辑
内容的提问来源于stack exchange,提问作者Sahil Arora
相关产品推荐
相关产品推荐

