Associated Values — 各enumケースに個別に任意のデータを添付できるSwiftのメカニズム。すべてのケースが同じ型の値を持つraw valuesとは異なり、associated valuesはケースごとに型と数が異なる場合があります。Apple Documentation, 2026によると、これは追加のラッパー型を作成せずにドメインを正確にモデル化するための重要な機能です。
重要ポイント
Associated Values は、enumケースが自身と一緒に格納できる追加情報です。宣言レベルで固定されるraw valuesとは異なり、associated valuesはenumインスタンスの作成時に設定されます。
支払い方法のモデル化を想像してください。creditCardケースは下4桁と有効期限を格納でき、applePayケースは何も格納しません。associated valuesを使用すると、サブクラスやオプショナルフィールドなしで自然に実装できます。
Appleのドキュメントによると、associated valuesはenumを単なる定数の集合から、関数型言語に特徴的な代数的データ型(直和型)に変換します。これによりコードの表現力が大幅に向上します。
Associated Values は、関数と同様に、ケースの後に括弧で囲んで宣言し、パラメータ名と型を指定します。
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
インスタンスを作成するとき、associated valuesは引数として渡されます。
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swiftはassociated valuesの数や型に制限を課しません。associated values内でジェネリクス、クロージャ関数、他のenumを使用できます。これにより複雑なネスト構造を構築できます。
associated valuesのパラメータ名はインスタンス作成時の引数ラベルとして使用され、コードの可読性が向上します。switchで抽出する際、名前はドキュメントとして機能し、各値の意味を明確にします。このアプローチによりコードは自己文書化され、データマッチング時のエラー可能性が低減します。これは大規模なiOSアプリケーションのチーム開発において特に価値があります。
Switch はassociated valuesを抽出する主要な方法です。値はletまたはvarを介して定数や変数にバインドされます。
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Swiftは部分マッチングをサポートしています — associated valuesに具体的な値を指定できます。
switch file {
case .image(let w, let h, "png"):
print("PNG画像 \(w)x\(h)")
case .image(1920, 1080, _):
print("Full HD画像")
default:
break
}
ワイルドカード(_)を使用すると不要なassociated valuesを無視でき、ケース内の定数を使用して特定の値との一致を確認できます。
多くの初心者開発者はassociated valuesとraw valuesを混同しています。これらは異なるユースケースを持つ異なるメカニズムです。
| 特性 | Raw Values | Associated Values |
|---|---|---|
| データ型 | すべてのケースで1つの型 | ケースごとに異なる型 |
| 割り当てタイミング | enum宣言時 | インスタンス作成時 |
| 必須性 | すべてのケースに値がある | 一部のケースは値がない場合がある |
| 互換性 | 相互排他的 — 同時に使用できない | |
Swift Evolutionによると、associated valuesはenumの再設計の一環としてSwift 2.0で導入されました。これらは型への代数的アプローチを提供し、各ケースが独自のシグネチャを持つ個別のコンストラクタとなります。
Associated Values は実際のiOSプロジェクトで積極的に使用されています。3つの典型的なシナリオを見てみましょう。
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
associated valuesを使用すると、enumはステートマシンのための強力なツールになります。各ケースが状態、associated valuesがその状態のパラメータです。コンパイラはすべての遷移が処理されることを保証します。
switchなしで単一のケースを確認するには、if caseまたはguard caseを使用します。1つのオプションのみを処理する必要がある場合、よりコンパクトです。
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("\(seconds)秒後にリクエストがタイムアウト")
}
guard case .httpError(let code, _) = error else {
return
}
print("コード\(code)のHTTPエラー")
よくある質問
はい、ケースはassociated valuesを持たなくても構いません — 例えば、case unknown。そのようなケースは追加データなしで通常のenumケースのように動作します。これはマーカー状態に便利です。
Swiftはassociated valuesを持つenumに対して自動的にEquatableを生成しません(Swift 4.2+より前)。明示的なEquatable実装を追加するか、switchを使用して各ケースを順次比較してください。
はい、indirect enumでのassociated valuesはツリーやリンクリストを構築する標準的な手法です。ケースはindirectとマークされた同じ型のassociated valueを含むことができます。
Associated Values は型安全です — 各ケースは自身のデータのみを持つことが保証されています。オプショナルを持つstructでは、すべてのインスタンスがすべてのフィールドを含み、実行時のnilチェックが必要です。
Swiftはassociated valuesを持つenumに対して自動的にCodableを生成しません。カスタムコーディングキーを使用してケースをswitchで処理するencodeとdecodeの手動実装が必要です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。