如何迭代 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 以後咱們就能夠跟以前那樣使用了。編譯器

相關文章
相關標籤/搜索