CaseIterable
CaseIterable
是 Swift 提供的一个协议,用来自动为枚举类型生成一个包含所有枚举值的集合。它适用于只有 enum
才能采用的特性,即枚举中所有的可能值都可以被迭代。
通过让枚举类型遵循 CaseIterable
协议,Swift 会自动生成一个 allCases
属性,它包含该枚举的所有值,这使得你可以方便地遍历和访问这些值。
语法
要使用 CaseIterable
,只需让你的枚举遵循该协议:
enum SomeEnum: CaseIterable {
case first
case second
case third
}
自动生成的 allCases
属性
allCases
属性当枚举遵循 CaseIterable
时,Swift 自动为其提供一个 allCases
的静态属性,返回一个包含所有枚举值的数组:
for value in SomeEnum.allCases {
print(value)
}
输出:
first
second
third
适用场景
迭代枚举值:当你需要遍历所有可能的枚举值时,
CaseIterable
非常有用。比如,用户界面上展示一组选项、测试用例、数据序列化/反序列化等。减少手动维护:如果没有
CaseIterable
,你需要手动维护一个所有枚举值的数组,而CaseIterable
自动生成这个数组,避免了错误和维护成本。
示例
enum Direction: CaseIterable {
case north
case south
case east
case west
}
for direction in Direction.allCases {
print(direction)
}
输出:
north
south
east
west
自定义 allCases
(在复杂场景下)
allCases
(在复杂场景下)虽然 Swift 会自动为 CaseIterable
提供默认的 allCases
,但你也可以为复杂的枚举自定义 allCases
属性。例如,如果枚举有关联值,或者你不希望某些枚举值出现在 allCases
中,你可以手动实现:
enum Filter: CaseIterable {
case byName
case byDate
case custom(String)
static var allCases: [Filter] {
return [.byName, .byDate] // 排除 .custom
}
}
总结
CaseIterable
协议让你可以轻松地获得所有枚举值,特别适用于没有关联值的简单枚举。通过
allCases
属性,可以遍历枚举的所有可能值,减少手动维护的错误风险。
Last updated