[WWDC18] Swift 4.2から使える便利なCaseIterableプロトコル #WWDC18

Swift 4.2から使える便利なCaseIterableプロトコルについてご紹介します。
2018.06.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。

はじめに

WWDC18のセッション、「What’s New in Swift」の中で、Swift 4.2で実装されたDerived Collection of Enum Cases SE-0194の話があったので、簡単に試してみました。

検証環境

  • macOS High Sierra 10.13.4
  • Xcode Version 10.0 beta (10L176w)

これまでのallCases

これまではenumの全ての値をコレクションで取得する場合は自分で定義していました。

enum Direction1 {
    case east
    case west
    case north
    case south

    static var allCases: [Direction1] = [.east, .west, .north, .south]
}
// [__lldb_expr_8.Direction1.east, __lldb_expr_8.Direction1.west, __lldb_expr_8.Direction1.north, __lldb_expr_8.Direction1.south]
print(Direction1.allCases)

Swift 4.2のallCases

Swift4.2からは CaseIterable プロトコルが使えます。 定義は以下のようになっており、allCases プロパティを通して全ての値をコレクションとして取得できるようになっています。

public protocol CaseIterable {

    /// A type that can represent a collection of all values of this type.
    associatedtype AllCases : Collection where Self.AllCases.Element == Self

    /// A collection of all values of this type.
    public static var allCases: Self.AllCases { get }
}

CaseIterable プロトコルを使うと以下のように書くことができます。

enum Direction2: CaseIterable {
    case east
    case west
    case north
    case south
}

// [__lldb_expr_8.Direction1.east, __lldb_expr_8.Direction1.west, __lldb_expr_8.Direction1.north, __lldb_expr_8.Direction1.south]
print(Direction2.allCases)

おわりに

私はUITableViewのSectionやRowをenum化して管理することが多いのですが、その時にenumの値の総数を取得したいケースがよくあります。 CaseIterable を使うと自動でallCasesプロパティが使えるので、caseが増えた場合のallCasesのメンテが無くなります。地味に嬉しいアップデートだと思います!