EnumはSwiftにおいて、関連する値のグループをひとつの名前にまとめる型です。CやObjective-Cではenumは単なる整数定数のセットですが、Swiftはassociated values、raw values、メソッド、プロトコルサポートを備えたファーストクラスの列挙型を提供します。Apple、2026によると、enumはiOS開発における型安全な状態モデリングの重要なツールのひとつです。
重要なポイント
Enum(列挙型)は、相互に排他的な選択肢の有限集合をまとめるカスタムデータ型です。Swiftでは、enumは単なる数値定数ではなく、独自のロジックを持つ完全な型です。
列挙型の各選択肢はケースと呼ばれます。Objective-Cのようにenumが整数型に限定されるのとは異なり、Swiftでは各ケースが独自のデータを格納し、メソッドを持つことができます。
Appleによると、Swiftのenumはジェネリクス、イニシャライザ、算出プロパティ、プロトコル準拠をサポートしており、状態、エラー、オプション、有限状態マシンのモデリングに適用できます。
相互に排他的な選択肢の有限集合を表現する必要がある場合、どこでもenumを使用してください:画面状態、エラータイプ、方向、フィルタリングオプションなど。
Enumはキーワードenumの後に名前と波括弧の本体を続けて宣言します。
enum CompassDirection {
case north
case south
case east
case west
}
ケースはカンマで区切って1行で宣言できます:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
ケースにアクセスするには、既知の型の後にドット構文を使用します:
let direction = CompassDirection.north
// 型が判明しています — 短縮構文が使用可能です:
var currentPlanet = .earth
変数に既知のenum型が代入されると、Swiftが自動的に型を推論し、ケースにアクセスする際に列挙型名を省略できます。
Raw Valuesは、各enumケースに割り当てられる単一の型の値です。Associated valuesとは異なり、raw valuesはすべてのケースで型が同じであり、宣言時に定義されます。
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
整数のraw valuesの場合、最初の値のみが明示的に設定されていれば、Swiftは自動的に値をインクリメントします:
enum Status: Int {
case pending = 1
case active // 2
case completed // 3
}
Raw valuesはInt、String、Character型、またはRawRepresentableプロトコルに準拠する任意の型にできます。Swiftはraw valueからenumを作成するためのイニシャライザinit?を自動生成します。これはAPIからのデータ解析に便利です。
Associated Valuesを使用すると、各enumケースに個別に異なるデータ型をバインドできます。Raw valuesとは異なり、associated valuesは型と数が異なる場合があります。
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
switchで処理する場合、associated valuesは変数や定数へのバインディングを通じて抽出されます:
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 — そのケースがenum型自体を参照する列挙型です。このようなケースはキーワードindirectでマークされます。
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
enumの前にindirectを使用すると、すべてのケースが再帰的としてマークされます。あるいは、特定のケースのみをindirectでマークすることもできます:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swiftは再帰的ケースを値ではなく参照(参照セマンティクス)として格納するためにindirectを使用します。これにより、スタック上でのenumの無限サイズを防ぎます。再帰的enumは、ツリー、リンクリスト、ASTの構築で広く使用されています。
Enumは構造体やクラスと同様にプロトコルに準拠できます。これは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アプリケーションにおける汎用的な構成要素となります。
よくある質問
Enumは相互に排他的な選択肢の有限集合を持つ型であり、structは任意のプロパティセットを持つ型です。Enumはstored propertiesを持つことはできませんが、computed propertiesとメソッドをサポートします。
いいえ、enumはraw valuesとassociated valuesを同時に持つことはできません。Raw valuesはすべてのケースで同じ型の値であり、associated valuesは各ケースの個別のデータです。これらのメカニズムは相互に排他的です。
CaseIterableプロトコルに準拠させてください。Swiftは自動的にallCasesプロパティを生成し、宣言順にすべてのケースのコレクションを返します。これはすべてのバリアントを反復処理するのに便利です。
Switchはコンパイラが網羅性をチェックするため最も安全な方法です。単一のケースをチェックするにはif case、associated valuesのないenumには==を使用できます。
はい、enumはジェネリクスをサポートしています:enum Result<T, E> { case success(T); case failure(E) }。これにより、成功とエラーを処理するための型安全なジェネリック構造を作成できます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。