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

Swift中如何基于CaseIterable实现包含可选值的枚举数组?

解决Swift枚举CaseIterable生成包含nil的可选数组问题

当枚举实现CaseIterable后只能获取到非可选的case数组,但我们需要生成包含nil的[Filter?]类型数组,且枚举case数量较多不想手动维护时,可以用以下两种方案解决:

方案一:给CaseIterable协议添加通用扩展

通过扩展让所有实现CaseIterable的枚举都具备生成包含nil的可选数组的能力:

extension CaseIterable where Self: Hashable {
    static var allCasesWithNil: [Self?] {
        allCases.map { $0 } + [nil]
    }
}

// 用法示例
enum Filter: CaseIterable {
    case filter1
    case filter2
    // 新增case时无需修改数组
}

let allFilters: [Filter?] = Filter.allCasesWithNil

方案二:在目标枚举内定义静态属性

如果只想给特定枚举添加该功能,直接在枚举内部实现静态属性即可:

enum Filter: CaseIterable {
    case filter1
    case filter2
    // ... 其他case
    
    static var allCasesWithNil: [Filter?] {
        allCases.map { $0 } + [nil]
    }
}

// 使用
let allFilters = Filter.allCasesWithNil

补充说明

  • 若枚举包含关联值,CaseIterable不会自动生成allCases,此时需要手动实现allCases数组,之后同样可以通过上述方法追加nil。
  • 两种方案都能避免手动维护数组,后续新增枚举case时数组会自动更新,减少手动编写的出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:43:11