如何迭代 Swift 中枚举的全部case

在 Swift 中,如何能迭代获取 enum 的全部 case 呢?答案就是 CaseIterable。经过遵照 CaseIterable 协议,能够经过 allCases 属性来获取全部 case 的集合。markdown

获取全部的 case

enum Direction: CaseIterable {
    case east
    case west
    case north
    case south
}
// 能够获取全部 case 的数量
let count = Direction.allCases.count
// 也能够遍历全部 case
for direction in Direction.allCases {
    print(direction)
}

east
west
north
south
复制代码

支持集合的全部操做

对于该集合,咱们不只能够遍历它,还能够对它进行 filter 、map 的高阶函数的操做。函数

enum Direction: Int, CaseIterable {
    case east = 0
    case west
    case north
    case south
}

// 进行 filter 操做
let result = Direction.allCases.filter { $0.rawValue > 1 }
for direction in result {
    print(direction)
}
 
// 进行 map 和 joined 操做
let caseList = Direction.allCases
                               .map({ "\($0)" })
                               .joined(separator: ", ")
// caseList == "north, south, east, west"
print(caseList)
复制代码

当 enum 有联合值的时候,如何使用 CaseIterable

当 enum 遵照该协议时,编译器会自动提供 CaseIterable 要求的函数实现,好比上面的代码。但 enum 有联合值的时候,是不会自动提供函数实现的。这时候就须要咱们本身去实现 CaseIterable 协议要求实现的内容了。spa

enum Barcode: CaseIterable {
    case upc(Int, Int, Int)
    case qrCode(String)
}
复制代码

上面这个代码是没法编译的,会提示报错:Type 'Barcode' does not conform to protocol 'CaseIterable'code

修改为下面的代码就能够了:orm

enum Barcode: CaseIterable {
    typealias AllCases = [Barcode]
    static var allCases: [Barcode] = [.upc(0, 0, 0), .qrCode("")]

    case upc(Int, Int, Int)
    case qrCode(String)
}

let count = Barcode.allCases.count
复制代码

实现了 AllCases 和 allCases 以后咱们就能够跟以前那样使用了。编译器

相关文章
相关标签/搜索