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

Swift嵌套枚举字符串拼接优化:自动生成子枚举前缀方案

解决Swift嵌套枚举RawValue前缀自动生成的问题

当然有办法!你可以通过自定义协议+反射的方式来实现这个需求,不用再手动重复写每个子枚举的前缀。核心思路是让每个子枚举遵循一个统一协议,借助Swift的反射能力自动获取子枚举的类型名称,以此拼接出对应的前缀。

下面是具体的实现方案:

第一步:定义自动生成前缀的协议

先写一个协议,用来规范子枚举的行为,同时提供默认实现来自动生成前缀:

protocol AutoRawPrefixable: RawRepresentable where RawValue == String {
    static var rawValuePrefix: String { get }
}

extension AutoRawPrefixable {
    static var rawValuePrefix: String {
        // 通过反射拿到当前枚举的类型名称,拼出前缀
        let typeName = String(describing: Self.self)
        return "/\(typeName)/"
    }
    
    // 自动生成带前缀的RawValue
    var rawValue: String {
        let mirror = Mirror(reflecting: self)
        guard let caseName = mirror.children.first?.label else {
            fatalError("无法获取枚举case的名称")
        }
        return Self.rawValuePrefix + caseName
    }
}

第二步:改造你的嵌套枚举

让所有子枚举遵循上面的协议,之后只需要声明case即可,不用手动写RawValue:

enum ParentEnum {
    enum ChildEnum1: String, AutoRawPrefixable {
        case c1, c2
    }
    
    enum ChildEnum2: String, AutoRawPrefixable {
        case c1, c2
    }
    
    // 后续新增的子枚举直接照这个格式写就行
    enum ChildEnum3: String, AutoRawPrefixable {
        case a, b, c
    }
}

测试效果

现在你可以直接访问枚举case的rawValue,前缀会自动生成:

print(ParentEnum.ChildEnum1.c1.rawValue) // 输出 "/ChildEnum1/c1"
print(ParentEnum.ChildEnum2.c2.rawValue) // 输出 "/ChildEnum2/c2"
print(ParentEnum.ChildEnum3.b.rawValue)  // 输出 "/ChildEnum3/b"

这个方案的好处是完全解耦了前缀和case的手动绑定,以后新增子枚举或者case时,只需要简单声明,不用再重复写前缀部分,大大减少了重复代码和出错的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:15:25