SwiftでEnumの全要素を配列で取得する

2019年5月25日 engineering

こんにちは、kz_moritaです。

最近になって、Swift のEnumの全要素を配列で取得できる便利な protocol である CaseIterable について知ったのでそのことについて書きます。

Enumの全列挙子を配列として使用したいといった場合には、このCaseIterableを使うと簡単に実現できるためおすすめです。

ドキュメントはこちら
CaseIterable

CaseIterableで全列挙

SwiftにはEnumがあり以下のように列挙することができます。

enum Color {
    case red
    case blue
    case green
    case white
}

ここで、上記で定義したenumのColorの全パターンを取得したいとします。自分はCaseIterableを知る前は以下のように記述していました。

enum Color {
    case red
    case blue
    case green
    case white

    // 全ケースを自分で定義
    static var allCases: [Color] = [.red, .blue, .green, .white]
}

Color.allCases.map { /* do something. */ }

これがCaseIterableを使用すると以下のように記載することができます。

enum Color: CaseIterable {
    case red
    case blue
    case green
    case white
}

// 自分で定義しなくても、allCasesが使用できる
Color.allCases.map { /* do something. */ }

自分で定義する必要がないため、allCasesへの追記もれなどが起こらなくなってかなり便利になりました。

CaseIterableはSwift4.2から

CaseIterableはSwift4.2で実装されているため、それ以降のバージョンで使用可能です。 proposalはこちら Derived Collection of Enum Cases

CaseIterableが発表されたのは、WWDC18のセッション What’s New in Swift のなかの模様です。

まとめ

Swift4.2で導入されたCaseIterableについて今更ながら紹介しました。
基本的に便利になるため積極的に使っていくと良いかと思います。

現在はSwift5も出ているのでそちらの機能も随時キャッチアップしていこうと思います。