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

