SwiftのEnum — その概要、構文、使い方

著者: IT Sectr 公開日: 2026-06-17 読了時間: 6 分

EnumはSwiftにおいて、関連する値のグループをひとつの名前にまとめる型です。CやObjective-Cではenumは単なる整数定数のセットですが、Swiftはassociated values、raw values、メソッド、プロトコルサポートを備えたファーストクラスの列挙型を提供します。Apple、2026によると、enumはiOS開発における型安全な状態モデリングの重要なツールのひとつです。

重要なポイント

  • Enum — 関連する値のグループのための型で、型安全性を保証
  • Raw Values — すべての列挙ケースに割り当てられる同じ型の値
  • Associated Values — 各ケースに個別に添付される異なるデータ型
  • ケースはcaseキーワードで宣言され、メソッドを持てる
  • Switchとenumの組み合わせではコンパイラによる網羅的なチェックが必要

SwiftのEnumとは?

Enum(列挙型)は、相互に排他的な選択肢の有限集合をまとめるカスタムデータ型です。Swiftでは、enumは単なる数値定数ではなく、独自のロジックを持つ完全な型です。

列挙型の各選択肢はケースと呼ばれます。Objective-Cのようにenumが整数型に限定されるのとは異なり、Swiftでは各ケースが独自のデータを格納し、メソッドを持つことができます。

Appleによると、Swiftのenumはジェネリクス、イニシャライザ、算出プロパティ、プロトコル準拠をサポートしており、状態、エラー、オプション、有限状態マシンのモデリングに適用できます。

相互に排他的な選択肢の有限集合を表現する必要がある場合、どこでもenumを使用してください:画面状態、エラータイプ、方向、フィルタリングオプションなど。

Enum宣言の構文

Enumはキーワードenumの後に名前と波括弧の本体を続けて宣言します。

swift
enum CompassDirection {
    case north
    case south
    case east
    case west
}

ケースはカンマで区切って1行で宣言できます:

swift
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

ケースにアクセスするには、既知の型の後にドット構文を使用します:

swift
let direction = CompassDirection.north
// 型が判明しています — 短縮構文が使用可能です:
var currentPlanet = .earth

変数に既知のenum型が代入されると、Swiftが自動的に型を推論し、ケースにアクセスする際に列挙型名を省略できます。

列挙型のRaw Values

Raw Valuesは、各enumケースに割り当てられる単一の型の値です。Associated valuesとは異なり、raw valuesはすべてのケースで型が同じであり、宣言時に定義されます。

swift
enum HTTPStatusCode: Int {
    case ok = 200
    case notFound = 404
    case internalServerError = 500
}

let code = HTTPStatusCode.notFound
print(code.rawValue) // 404

整数のraw valuesの場合、最初の値のみが明示的に設定されていれば、Swiftは自動的に値をインクリメントします:

swift
enum Status: Int {
    case pending = 1
    case active      // 2
    case completed   // 3
}

Raw valuesはIntStringCharacter型、またはRawRepresentableプロトコルに準拠する任意の型にできます。Swiftはraw valueからenumを作成するためのイニシャライザinit?を自動生成します。これはAPIからのデータ解析に便利です。

EnumのAssociated Values

Associated Valuesを使用すると、各enumケースに個別に異なるデータ型をバインドできます。Raw valuesとは異なり、associated valuesは型と数が異なる場合があります。

swift
enum NetworkError {
    case timeout(seconds: Int)
    case httpError(code: Int, message: String)
    case noConnection
    case unknown(error: Error)
}

switchで処理する場合、associated valuesは変数や定数へのバインディングを通じて抽出されます:

swift
let error = NetworkError.httpError(code: 403, message: "Forbidden")

switch error {
case .timeout(let seconds):
    print("\(seconds)s秒後にタイムアウト")
case .httpError(let code, let message):
    print("HTTP \(code): \(message)")
case .noConnection:
    print("接続なし")
case .unknown(let err):
    print("不明: \(err.localizedDescription)")
}

Appleのドキュメントによると、associated valuesはenumを、別々のラッパー型を作成せずに複雑な状態をモデリングするための表現力豊かなツールにします。Resultのようなシナリオや、コンテキストを伴うエラーのモデリングに使用してください。

再帰的Enum(indirect)

再帰的Enum — そのケースがenum型自体を参照する列挙型です。このようなケースはキーワードindirectでマークされます。

swift
indirect enum LinkedList<T> {
    case empty
    case node(value: T, next: LinkedList<T>)
}

enumの前にindirectを使用すると、すべてのケースが再帰的としてマークされます。あるいは、特定のケースのみをindirectでマークすることもできます:

swift
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

Swiftは再帰的ケースを値ではなく参照(参照セマンティクス)として格納するためにindirectを使用します。これにより、スタック上でのenumの無限サイズを防ぎます。再帰的enumは、ツリー、リンクリスト、ASTの構築で広く使用されています。

Enumとプロトコル

Enumは構造体やクラスと同様にプロトコルに準拠できます。これはSwiftのプロトコル指向プログラミングにおける重要な機能です。

swift
protocol Describable {
    var description: String { get }
}

enum PaymentMethod: Describable {
    case creditCard(last4: String)
    case applePay
    case bankTransfer

    var description: String {
        switch self {
        case .creditCard(let last4):
            return "Card ending in \(last4)"
        case .applePay:
            return "Apple Pay"
        case .bankTransfer:
            return "Bank Transfer"
        }
    }
}

EnumはCocoaプロトコルにも準拠できます。たとえば、CaseIterableはすべてのケースのコレクションを自動生成し、Codableはシリアライゼーションのためです。これにより、enumはSwiftアプリケーションにおける汎用的な構成要素となります。

よくある質問

Swiftでenumとstructの違いは何ですか?

Enumは相互に排他的な選択肢の有限集合を持つ型であり、structは任意のプロパティセットを持つ型です。Enumはstored propertiesを持つことはできませんが、computed propertiesとメソッドをサポートします。

Enumはraw valuesとassociated valuesを同時に持つことはできますか?

いいえ、enumはraw valuesとassociated valuesを同時に持つことはできません。Raw valuesはすべてのケースで同じ型の値であり、associated valuesは各ケースの個別のデータです。これらのメカニズムは相互に排他的です。

すべてのenumケースの配列を取得するには?

CaseIterableプロトコルに準拠させてください。Swiftは自動的にallCasesプロパティを生成し、宣言順にすべてのケースのコレクションを返します。これはすべてのバリアントを反復処理するのに便利です。

Enumを処理するためにswitchを使うことは必須ですか?

Switchはコンパイラが網羅性をチェックするため最も安全な方法です。単一のケースをチェックするにはif case、associated valuesのないenumには==を使用できます。

ジェネリクスを使用してenumを作成できますか?

はい、enumはジェネリクスをサポートしています:enum Result<T, E> { case success(T); case failure(E) }。これにより、成功とエラーを処理するための型安全なジェネリック構造を作成できます。

まとめ

  • EnumはSwiftにおいて、メソッド、ジェネリクス、プロトコルをサポートする完全な型です
  • Raw Valuesを使用すると、すべてのケースに同じ型の値を設定できます
  • Associated Valuesにより、各ケースに異なるデータをバインドできます
  • Indirectケースはenumの再帰的構造に必要です
  • プロトコルはenumによって実装可能 — これがSwiftのPOPの基盤です
  • Switchとenumの組み合わせはコンパイル時に網羅的な処理を保証します
  • 有限状態と型安全なオプションのモデリングにenumを使用しましょう

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください