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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:57:36