如何在Swift中简化重复换算代码,或从if-else/switch返回多值
Swift 代码简化方案
你的代码冗余主要来自两部分:重复的输入值计算、每个单位转换都单独做了一次lengthUnit判断。我们可以通过基准单位中转的思路简化逻辑,也可以直接用元组一次性返回三个单位的结果。
方案1:保留原有三个计算属性,仅收拢公共逻辑
先把输入值的计算、输入单位转基准单位(米)的逻辑抽成公共部分,三个结果直接从基准米值换算即可:
// 私有公共属性:将输入统一转换为米为单位的基准值 private var baseMeter: Double { let lengthInput = Double(lengthIn1) + Double(lengthIn2) / 100 switch lengthUnit { case 0: return lengthInput // 输入本身是米 case 1: return lengthInput / 39.37 // 输入是英寸,转米 case 2: return lengthInput / 3.281 // 输入是英尺,转米 default: return lengthInput // 异常兜底 } } // 原有三个属性直接从基准值换算,仅需一行 var meterCalc: Double { baseMeter } var inchCalc: Double { baseMeter * 39.37 } var feetCalc: Double { baseMeter * 3.281 }
方案2:单次判断直接返回三个值(满足你想要一次拿到三个结果的需求)
Swift 支持返回元组类型,你可以只做一次条件判断,直接同时返回三个单位的结果,后续不同场景直接取对应字段使用即可:
// 一次计算返回三个单位的结果,元组字段可以自定义命名 var allLengthResults: (meter: Double, inch: Double, feet: Double) { let lengthInput = Double(lengthIn1) + Double(lengthIn2) / 100 let baseMeter: Double switch lengthUnit { case 0: baseMeter = lengthInput case 1: baseMeter = lengthInput / 39.37 case 2: baseMeter = lengthInput / 3.281 default: baseMeter = lengthInput } return (baseMeter, baseMeter * 39.37, baseMeter * 3.281) } // 调用示例 let results = allLengthResults // 不同场景分别取对应值即可 let meterVal = results.meter let inchVal = results.inch let feetVal = results.feet
内容的提问来源于stack exchange,提问作者hps28
相关产品推荐
相关产品推荐

