Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Swift辞典

  1. トップページ
  2. Swift辞典
  3. enum の Associated Values

enum の Associated Values

Swiftの enum は各ケースに異なる型の関連値(Associated Values)を持つことができます。これにより、enum 1つで複数パターンのデータをモデリングできます。

構文
// 関連値を持つ enum の定義
enum 列挙型名 {
    case ケース1(型1)
    case ケース2(型2, 型3)
    case ケース3(ラベル: 型4)
}

// 関連値の取り出し(switch)
switch 値 {
case .ケース1(let x):
    // x を使った処理
case .ケース2(let a, let b):
    // a, b を使った処理
}
構文一覧
構文概要
case 名前(型)関連値を1つ持つケースを定義します。
case 名前(型1, 型2)複数の関連値を持つケースを定義します。
case 名前(ラベル: 型)ラベル付きの関連値を定義します。
switch でのパターンマッチcase .ケース(let x): で関連値を取り出します。
if case let パターン = 値特定のケースのみ条件分岐します。
サンプルコード
// HTTP レスポンスをモデル化
enum HTTPResult {
    case success(statusCode: Int, data: String)
    case failure(statusCode: Int, message: String)
    case loading
}

// 使用例
let result = HTTPResult.success(statusCode: 200, data: "{ \"name\": \"Swift\" }")
let error  = HTTPResult.failure(statusCode: 404, message: "Not Found")

// switch でパターンマッチング
func handleResult(_ result: HTTPResult) {
    switch result {
    case .success(let code, let data):
        print("成功 (\(code)): \(data)")
    case .failure(let code, let message):
        print("失敗 (\(code)): \(message)")
    case .loading:
        print("読み込み中...")
    }
}

handleResult(result)
handleResult(error)

// if case let: 特定のケースだけ処理
if case .success(let code, _) = result, code == 200 {
    print("200 OK!")
}

// 再帰的な enum(indirect)
indirect enum Tree {
    case leaf(Int)
    case node(Tree, Tree)
}

let tree = Tree.node(.leaf(1), .node(.leaf(2), .leaf(3)))
概要

関連値を持つ enum は、成功と失敗で異なるデータを持つ Result 型や、ネットワーク状態のモデリングに非常に適しています。各ケースが異なる型・数の値を持てるのが特徴です。

再帰的な enum(木構造など)では『indirect』キーワードを付ける必要があります。これはコンパイラに間接参照を使うよう指示します。Associated Values と RawValue は同時に使用できません。どちらか一方のみ使えます。

enum にメソッドを追加する方法についてはenum のメソッド・プロパティ・mutatingを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。