[WWDC18] Swift 4.2から使える便利なCaseIterableプロトコル #WWDC18
本記事は 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のメンテが無くなります。地味に嬉しいアップデートだと思います!