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

Swift中能否将枚举的多个case分组表示为另一个case?

实现方案

该需求完全可以实现,以下是两种主流可行方案:

方案1:新增分组枚举 + 原枚举关联分组属性(最符合你预期写法)

这个方案完全可以实现你示例中的调用方式,只需给原Device枚举扩展一个分组映射属性即可:
首先保留你定义的两个枚举:

enum Device {
    case iPhone_13Pro, iPhone_12Pro
    case iPadPro_129, iPadPro_11
}

enum DeviceGroup {
    case iPhones
    case iPads
}

然后给Device添加分组映射的计算属性:

extension Device {
    var group: DeviceGroup {
        switch self {
        case .iPhone_13Pro, .iPhone_12Pro:
            return .iPhones
        case .iPadPro_129, .iPadPro_11:
            return .iPads
        }
    }
}

最终调用时就可以直接按你期望的写法使用:

let device: Device = .iPhone_13Pro
switch device.group {
case .iPhones:
    print("These are iPhones")
case .iPads:
    print("These are iPads")
}

后续新增设备枚举值时,只需要在group属性的switch中补充对应分组即可,所有用到分组判断的地方无需修改,维护成本极低。

方案2:无需额外定义分组枚举,直接扩展判断属性

如果你不需要独立的分组枚举,也可以直接给Device扩展分类判断的Bool属性:

extension Device {
    var isiPhone: Bool {
        switch self {
        case .iPhone_13Pro, .iPhone_12Pro:
            return true
        default:
            return false
        }
    }
    
    var isiPad: Bool { !isiPhone }
}

使用时可以通过模式匹配的where子句实现无罗列调用:

let device: Device = .iPadPro_11
switch device {
case _ where device.isiPhone:
    print("These are iPhones")
case _ where device.isiPad:
    print("These are iPads")
}

内容的提问来源于stack exchange,提问作者sjk.27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:09:03