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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:39:31