You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何根据输入切换Enum?求枚举重构字符串判断逻辑方案

嘿,我懂你想把字符串判断的switch改成枚举的需求——确实枚举能让代码更安全、易维护,还能彻底避免拼写错误的坑!我来帮你一步步改造这段代码,保证灵活性拉满~

首先先把你原来的代码补全(应该是没写完default分支):

var weightType: String = "kettlebell"
func returnWeightLimit() -> Double {
    switch weightType {
    case "barbell":
        return 132.0
    case "kettlebell":
        return 70.5
    case "dumbbell":
        return 115.0
    default:
        return 0.0
    }
}

接下来用枚举重构,分两步走:

第一步:定义带重量限值的枚举

我们让枚举遵守String协议,这样既能兼容原来的字符串值,又能享受枚举的类型安全:

enum WeightType: String {
    case barbell
    case kettlebell
    case dumbbell
    
    // 给每个枚举case绑定对应的重量限值
    var weightLimit: Double {
        switch self {
        case .barbell:
            return 132.0
        case .kettlebell:
            return 70.5
        case .dumbbell:
            return 115.0
        }
    }
}

第二步:改造原有的变量和函数

现在把字符串类型的weightType改成枚举类型,函数里直接调用枚举的计算属性就行:

// 现在变量是枚举类型,再也不用担心拼写错误了!
var weightType: WeightType = .kettlebell

func returnWeightLimit() -> Double {
    // 不用再写冗长的switch,直接返回枚举的weightLimit
    return weightType.weightLimit
}

// 测试一下,输出70.5
print(returnWeightLimit())

额外的灵活扩展

如果需要从字符串(比如API返回的字段)转换成枚举,因为我们的枚举遵守了String协议,直接用rawValue初始化就行:

// 从字符串转枚举,自动处理无效值
if let apiWeightType = WeightType(rawValue: "dumbbell") {
    print(apiWeightType.weightLimit) // 输出115.0
} else {
    print("未知的重量类型")
}

为啥这比原来的switch好?

  • 类型安全:再也不会因为手滑把"kettlebell"写成"kettlebel"导致bug,编译器会直接报错
  • 扩展性强:以后要加新的重量类型,只需要在枚举里加个case,再补一下weightLimit的分支就行,函数完全不用改
  • 可读性高:枚举的case语义明确,别人看代码一眼就懂有哪些重量类型可选

内容的提问来源于stack exchange,提问作者mlynnerup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:17:37