如何将NSNumber数组转换为Swift枚举?OC与Swift枚举互转
符合Swift风格的数组转换实现方案
首先先修正你现有代码里的小问题:createAction函数缺少返回值类型声明,且switch的部分case末尾少了冒号,修正后如下:
func createAction(_ action: PTYAction) -> Action { switch action { case .blockSpace: return .blockSpace case .leaveSpace: return .leaveSpace case .muteSpace: return .muteSpace case .unmuteSpace: return .unmuteSpace } }
接下来是createActions函数的Swift风格实现,这里推荐两种实用思路:
思路一:用compactMap处理转换与无效值过滤
NSNumber数组里可能存在无法转换为有效PTYAction的值,compactMap可以自动过滤转换失败的元素,避免数组中出现nil:
func createActions(_ actions: [NSNumber]) -> [Action] { actions.compactMap { number in guard let ptyAction = PTYAction(rawValue: number.uint32Value) else { return nil } return createAction(ptyAction) } }
思路二:给Swift枚举添加初始化器(更优雅的内聚写法)
把转换逻辑封装到Action枚举内部,让枚举自身具备从OC枚举或NSNumber转换的能力,外部调用会更简洁:
enum Action { case blockSpace case leaveSpace case muteSpace case unmuteSpace init?(_ ptyAction: PTYAction) { switch ptyAction { case .blockSpace: self = .blockSpace case .leaveSpace: self = .leaveSpace case .muteSpace: self = .muteSpace case .unmuteSpace: self = .unmuteSpace @unknown default: // 兼容未来OC端新增的枚举值,避免崩溃 return nil } } init?(_ number: NSNumber) { guard let ptyAction = PTYAction(rawValue: number.uint32Value) else { return nil } self.init(ptyAction) } } // 此时createActions可以简化成一行代码: func createActions(_ actions: [NSNumber]) -> [Action] { actions.compactMap(Action.init) }
这种写法的优势是逻辑内聚,同时通过@unknown default处理未来OC枚举新增值的场景,提升了代码的健壮性。
内容的提问来源于stack exchange,提问作者Rik
相关产品推荐
相关产品推荐

