Swift如何无需workaround直接返回枚举的「枚举名.case值」格式字符串
通用枚举转
枚举名.case值格式方案 不需要给每个枚举单独加自定义属性,通过统一协议+字符串插值扩展即可实现需求:
- 定义通用协议和默认实现
// 所有需要映射到JS侧枚举的Swift枚举统一遵守该协议即可 protocol JSEnumConvertible { var jsEnumString: String { get } } extension JSEnumConvertible { var jsEnumString: String { // 自动拼接 枚举名.case名 "\(Self.self).\(self)" } } // 扩展字符串插值,直接插入枚举即可输出对应格式 extension String.StringInterpolation { mutating func appendInterpolation<T: JSEnumConvertible>(_ jsEnum: T) { appendLiteral(jsEnum.jsEnumString) } }
- 业务枚举只需遵守协议,无需额外写属性
enum JavaSwift { case voidFunc case boolFunc(_ : Bool) case enumFunc(_ : JSEnum) // 仅需声明遵守协议,无额外代码 enum JSEnum: String, JSEnumConvertible { case demo } }
- 直接插值即可得到目标格式
extension JavaSwift { var js: String { switch self { case .voidFunc: return "voidFunction();" case .boolFunc(let n): return "boolFunction(\(n));" // 无需调用额外属性,直接插入枚举实例即可 case .enumFunc(let n): return "enumFunction(\(n));" } } }
Xcode缓存报错解决
无需重启Xcode,执行以下两步即可快速清理缓存:
- 按快捷键
Cmd + Shift + K清理当前项目构建缓存 - 访问路径
~/Library/Developer/Xcode/DerivedData,删除对应项目的缓存文件夹
优化建议
- 嵌入JS定义枚举:自动生成Swift代码时,可直接将JS侧枚举的完整值作为Swift枚举的RawValue,比如给无关联值的枚举设置
String类型RawValue,每个case的rawValue直接写死为JSEnum.demo格式,省去运行时拼接逻辑,性能更高。 - 完全去掉js计算属性:可以通过两种方式实现:
- 自动生成代码时给每个case增加对应JS模板的关联值,比如无参数的case写为
case voidFunc(js: String = "voidFunction()"),带参数的case写为case boolFunc(Bool, jsTemplate: String = "boolFunction(%@)"),再写通用的js计算属性,根据模板替换参数即可,无需为每个case写switch分支 - 采用Swift Macro宏,自定义生成js属性的逻辑,枚举只需加宏注解即可自动生成所有case的js代码实现
- 自动生成代码时给每个case增加对应JS模板的关联值,比如无参数的case写为
- 贴近JS风格优化:自动生成代码时统一去掉所有参数的外部标签,枚举case命名和JS侧函数/枚举名完全对齐,调用时可以做到
run(.boolFunc(true))和JS侧boolFunc(true)的写法几乎一致,降低语法差异感知。
内容的提问来源于stack exchange,提问作者JDev
相关产品推荐
相关产品推荐

