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

Swift中获取Objective-C枚举值的问题求助

问题解答

为什么OC枚举没有allCases?

Swift的allCases是CaseIterable协议提供的特性,但这个协议仅适用于Swift原生定义的枚举。Objective-C定义的枚举导入Swift后,默认不会遵循CaseIterable,也无法自动获取所有枚举成员,所以你调用AdvertType.allCases会报错。

字符串转OC枚举的可行方法

方法1:手动扩展CaseIterable(适合需要遍历所有枚举的场景)

如果需要遍历枚举,你可以手动给AdvertType扩展CaseIterable协议,手动列出所有枚举成员:

extension AdvertType: CaseIterable {
    static var allCases: [AdvertType] {
        return [.loading, .finished] // 这里要把OC枚举的所有值都列全
    }
}

之后就能用你原来的遍历代码了,但要注意:如果后续OC枚举新增了成员,这里必须同步更新,否则会遗漏。

方法2:建立字符串-枚举映射(最简便的转换方式)

如果只是需要把字符串转成枚举,最直接的方式是手动维护一个映射字典,甚至可以实现类似下标访问的语法,满足你想要的简便需求:

extension AdvertType {
    // 实现下标访问
    static subscript(_ stateString: String) -> AdvertType? {
        let lowercasedStr = stateString.lowercased()
        let mapping: [String: AdvertType] = [
            "loading": .loading,
            "finished": .finished
        ]
        return mapping[lowercasedStr]
    }

    // 或者静态方法,按需选择
    static func from(_ stateString: String) -> AdvertType? {
        return self[stateString]
    }
}

// 使用示例
let eventState = "finished"
if let enumState = AdvertType[eventState] {
    // 成功获取到AdvertType.finished
}

补充说明

OC枚举导入Swift后,原始值是NSUInteger类型(整数),不是字符串,所以没法像Swift原生字符串枚举那样用AdvertType(rawValue: eventState)直接初始化,必须通过手动映射来实现字符串到枚举的转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:57:05