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
相关产品推荐
相关产品推荐

