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

