Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #310】enumですべてのcaseを返す方法

はじめに

enumのすべてのcaseを返したい場合があります。Swift4.1までの場合、そのためのメソッドやプロパティを作成して対応していました。

下記の例のように実装していました。

import Foundation

enum Device {
    case iPhoneXr
    case iPhoneXs
    case iPhoneXsMax
    
    static var all: [Device] {
        return [
            .iPhoneXs, .iPhoneXs, .iPhoneXsMax
        ]
    }
}

for phone in Device.all {
    print(phone)
}

その問題点は、caseを追加した時に、そのメソッドやプロパティにも追加しないといけないことが漏れてしまい不具合が発生してしまうことでした。

不具合を含んだままリリースすることはなかったとしても、ソースレビューで指摘されたりなどしていました。

CaseIterableプロトコル

Swift4.2になり、CaseIterableプロトコルが提供され、採用していれば、allCasesプロパティで全てのcaseが返されます。

使い方は下記の例の通りです。

import Foundation

enum Device: CaseIterable {
    case iPhoneXr
    case iPhoneXs
    case iPhoneXsMax
}

for phone in Device.allCases {
    print(phone)
}

Swift4.2でのうれしい更新です。