Swift新手求助:如何将闭包用作枚举的RawValue?
嘿,作为Swift新手能想到把闭包玩到枚举里还挺有想法的!不过你贴的代码会直接报错,因为Swift对枚举的RawValue类型有特定要求,咱们一步步来理清楚怎么实现~
先说说你代码的问题
你写的enum Tpi:Function里,Swift并没有内置的Function协议,而且闭包类型本身不能直接作为枚举的RawValue——因为RawValue必须是可哈希、能通过静态方法初始化的类型,闭包显然不满足这些条件,所以直接这么写肯定行不通。
方案1:用枚举关联值绑定闭包(更推荐)
如果你的核心需求是给枚举的每个case绑定一段闭包逻辑,用关联值是最符合Swift常规用法的方式,写法简单还灵活:
enum Tpi { // 给case关联一个无参无返回值的闭包类型 case func1(() -> Void) } // 创建枚举实例时传入闭包 let xsel = Tpi.func1 { print("say hi!") } // 调用闭包的时候,需要先提取关联值 switch xsel { case .func1(let closure): closure() // 输出:say hi! }
这种方式的好处是,你可以给不同的case绑定不同类型的闭包(比如有的带参数,有的有返回值),完全按需定制。
方案2:自定义RawRepresentable实现闭包作为RawValue
如果你确实想用RawValue的方式来实现,那需要让枚举遵守RawRepresentable协议,自己手动实现rawValue属性和初始化方法。注意:因为闭包是引用类型,没法直接比较相等,所以初始化方法会有局限,咱们看代码:
enum Tpi: RawRepresentable { // 明确RawValue的类型是无参无返回值的闭包 typealias RawValue = () -> Void // 定义枚举case case func1 // 给每个case返回对应的闭包逻辑 var rawValue: RawValue { switch self { case .func1: return { print("say hi!") } } } // 实现初始化方法:因为闭包不能比较,这里只能做简单实现(比如默认返回.func1) init?(rawValue: RawValue) { self = .func1 } } // 使用的时候就和你原来的思路一致了 let xsel = Tpi.func1.rawValue xsel() // 输出:say hi!
这里要注意,这个初始化方法其实不太实用——因为你没法通过传入一个闭包来反向推断出对应的枚举case,毕竟闭包不能直接判断相等。所以如果不是有特殊需求,更推荐方案1的关联值写法。
内容的提问来源于stack exchange,提问作者user12397428
相关产品推荐
相关产品推荐

