SwiftのAssociated Values:概要、構文、例

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

Associated Values — 各enumケースに個別に任意のデータを添付できるSwiftのメカニズム。すべてのケースが同じ型の値を持つraw valuesとは異なり、associated valuesはケースごとに型と数が異なる場合があります。Apple Documentation, 2026によると、これは追加のラッパー型を作成せずにドメインを正確にモデル化するための重要な機能です。

重要ポイント

  • Associated Values — enumケースに添付された個別のデータ
  • はケースごとに異なる場合がある
  • 抽出はswitchまたはif caseでの値バインディングによる
  • 相互排他 — associated valuesはraw valuesと互換性がない
  • 実践 — エラー、クエリ結果、UI状態のモデル化

Associated Valuesとは?

Associated Values は、enumケースが自身と一緒に格納できる追加情報です。宣言レベルで固定されるraw valuesとは異なり、associated valuesはenumインスタンスの作成時に設定されます。

支払い方法のモデル化を想像してください。creditCardケースは下4桁と有効期限を格納でき、applePayケースは何も格納しません。associated valuesを使用すると、サブクラスやオプショナルフィールドなしで自然に実装できます。

Appleのドキュメントによると、associated valuesはenumを単なる定数の集合から、関数型言語に特徴的な代数的データ型(直和型)に変換します。これによりコードの表現力が大幅に向上します。

Associated valuesの構文

Associated Values は、関数と同様に、ケースの後に括弧で囲んで宣言し、パラメータ名と型を指定します。

swift
enum MediaFile {
    case image(width: Int, height: Int, format: String)
    case video(duration: Double, codec: String)
    case audio(bitrate: Int)
    case unknown
}

インスタンスを作成するとき、associated valuesは引数として渡されます。

swift
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

Switch はassociated valuesを抽出する主要な方法です。値はletまたはvarを介して定数や変数にバインドされます。

swift
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に具体的な値を指定できます。

swift
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 vs Raw Values

多くの初心者開発者はassociated valuesとraw valuesを混同しています。これらは異なるユースケースを持つ異なるメカニズムです。

特性Raw ValuesAssociated Values
データ型すべてのケースで1つの型ケースごとに異なる型
割り当てタイミングenum宣言時インスタンス作成時
必須性すべてのケースに値がある一部のケースは値がない場合がある
互換性相互排他的 — 同時に使用できない

Swift Evolutionによると、associated valuesはenumの再設計の一環としてSwift 2.0で導入されました。これらは型への代数的アプローチを提供し、各ケースが独自のシグネチャを持つ個別のコンストラクタとなります。

Associated valuesの実践例

Associated Values は実際のiOSプロジェクトで積極的に使用されています。3つの典型的なシナリオを見てみましょう。

API応答のモデル化

swift
enum APIResponse<T: Codable> {
    case success(data: T, cached: Bool)
    case failure(error: Error, retryAvailable: Bool)
    case loading(progress: Double)
}

UIステートマシン

swift
enum ViewState<T> {
    case idle
    case loading(message: String)
    case loaded(data: T)
    case error(message: String, retryAction: () -> Void)
}

associated valuesを使用すると、enumはステートマシンのための強力なツールになります。各ケースが状態、associated valuesがその状態のパラメータです。コンパイラはすべての遷移が処理されることを保証します。

if caseとguard caseによる抽出

switchなしで単一のケースを確認するには、if caseまたはguard caseを使用します。1つのオプションのみを処理する必要がある場合、よりコンパクトです。

swift
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エラー")

よくある質問

パラメータなしでenumはassociated valuesを持てますか?

はい、ケースはassociated valuesを持たなくても構いません — 例えば、case unknown。そのようなケースは追加データなしで通常のenumケースのように動作します。これはマーカー状態に便利です。

associated valuesを持つ2つのenumを比較するには?

Swiftはassociated valuesを持つenumに対して自動的にEquatableを生成しません(Swift 4.2+より前)。明示的なEquatable実装を追加するか、switchを使用して各ケースを順次比較してください。

再帰的enumでassociated valuesを使用できますか?

はい、indirect enumでのassociated valuesはツリーやリンクリストを構築する標準的な手法です。ケースはindirectとマークされた同じ型のassociated valueを含むことができます。

Associated valuesはstructのオプショナルプロパティとどう違う?

Associated Values は型安全です — 各ケースは自身のデータのみを持つことが保証されています。オプショナルを持つstructでは、すべてのインスタンスがすべてのフィールドを含み、実行時のnilチェックが必要です。

Associated valuesはCodableをサポートしていますか?

Swiftはassociated valuesを持つenumに対して自動的にCodableを生成しません。カスタムコーディングキーを使用してケースをswitchで処理するencodedecodeの手動実装が必要です。

まとめ

  • Associated Values — 各enumケースに異なるデータを添付するメカニズム
  • 構文 — 関数のようにケースの後に括弧でパラメータを宣言
  • 抽出 — letバインディングまたはif caseでのswitchによる
  • 非互換 — raw valuesとの併用不可
  • ジェネリクス — associated values内でenumを普遍的なコンテナに
  • ステートマシン — iOSでのassociated valuesの典型的な使用例

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

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

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

こちらもお読みください