前のセクションの例は、列挙型の各ケースが他に依存せずに定義(型定義)された値です。定数や変数を Planet.Earth に設定して、この値を後から確認することができます。一方で、ケースの値の並びに別の型の関連値を持たせることが効果的な場合があります。ケースの値に追加的な情報を持たせることができ、ケースを利用するたびにこの情報を変更することも可能です。

Swift の列挙型では、型を問わず関連値を持つよう定義でき、必要であれば列挙型のケースごとに異なる値の型にすることができます。このような列挙型は、他のプログラミング言語では discriminated unionstagged unionsvariants として知られています。

例えば、在庫追跡システムが、2 種類のバーコードで製品を追跡する必要があるとします。ある製品は、数値 0 から 9 を使用する UPC-A 形式の 1D バーコードでラベル付けされています。各バーコードには 1 桁のナンバーシステムの数値があり、5 桁の製造元コード、5 桁の製品コードが続きます。そして最後に、コードが正しくスキャンされたかを検証するための 1 桁のチェック用の数値があります。

image: barcode_UPC_2x

別の製品は、ISO 8859-1 の文字を使用することができ、2,953 文字の長さまでの文字列をエンコードすることができる QR コード形式の 2D バーコードでラベル付けされています。

image: barcode_QR_2x

在庫追跡システムが、UPC-A バーコードを 4 つの整数値のタプルとして保存、そして QR コードのバーコードを文字列として保存することができれば便利になります。

これらの製品バーコードを定義する Swift の列挙型は、次のようになります。

enum Barcode {
    case UPCA(Int, Int, Int, Int)
    case QRCode(String)
}

これは次のように読むことができます。

「(IntIntIntInt) 型の関連値を持つ UPCA の値、または String 型の関連値を持つ QRCode の値のいずれかを取ることができる列挙型 Barcode を定義。」

この定義は Int や String の実際の値は持たず、Barcode の定数または変数が Barcode.UPCA や Barcode.QRCode のときに保持できる関連値の型を定義しているだけです。

いずれかの型を使用して新たなバーコードを生成することができます。

var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)

この例は、新しい変数 productBarcode を生成し、関連するタプル値 (8, 85909, 51226, 3) を持つ Barcode.UPCA の値を代入しています。

同じ製品に対して、別の種類のバーコードを割り当てることができます。

productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

この時点で、元の Barcode.UPCA と整数値は、新しい Barcode.QRCode と文字列値で置き換えられます。Barcode 型の定数あるいは変数は、.UPCA と .QRCode のどちらでも(関連値と共に)保持することができますが、一度にどちらかだけを保持することができます。

バーコードの種類の違いについても、同じように switch 文で確認することができます。ただし今回は、switch 文において関連値を取り出すことができます。switch のケース本体内で利用するために、let を置いて定数として各関連値を取り出します。

switch productBarcode {
case .UPCA(let numberSystem, let manufacturer, let product, let check):
    print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case .QRCode(let productCode):
    print("QR code: \(productCode).")
}
// "QR code: ABCDEFGHIJKLMNOP." と出力

列挙型のケースのすべての関連値を定数として、あるいは変数として取り出す場合には、ケース名の前にアノテーションとして let を置いて、簡潔にすることができます。

switch productBarcode {
case let .UPCA(numberSystem, manufacturer, product, check):
    print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .QRCode(productCode):
    print("QR code: \(productCode).")
}
// "QR code: ABCDEFGHIJKLMNOP." と出力

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.