unions
や variants
のように、それぞれのケースで任意の型の関連値を格納できます。それぞれで適切な型の異なる値のセットで関連付けられたケースを列挙型の一部として定義できます。extension
で機能を拡張することもできます。また、プロトコルに準拠して標準機能を提供することもできます。enum
キーワードを使用して列挙型を導入し、それらの定義全体を中括弧のペア({}
)内に配置します。north
、south
、east
、west
など)は、その列挙ケースです。case
キーワードを使用して、新しい列挙ケースを導入します。NOTE C 言語や Objective-C などの言語とは異なり、Swift 列挙型のケースにはデフォルトで整数値が設定されていません。上記のCompassPoint
の例では、north
、south
、east
、west
は暗黙的に0
、1
、2
、3
になりません。代わりに、異なる列挙ケースはそれ自体が値であり、明示的に定義されたCompassPoint
型です。
,
)で区切って 1 行で表示できます。CompassPoint
や Planet
など)は大文字で始まります。列挙型は、1 つのグループなことが自明なため、複数の名前ではなく単数の名前を付けましょう:directionToHead
の型は、CompassPoint
のある値の 1 つで初期化された場合、型が推論されます。一度 directionToHead
が CompassPoint
として宣言されたら、次からは短いドット構文(.
)を使用して別の CompassPoint
値を設定できます。directionToHead
の型はすでにわかっているため、値を設定するときに型を省略できます。これにより、明示的に型指定された列挙型の値を操作するときに、非常に読みやすいコードが作成できます。switch
文を使って、個々の列挙値をパターンマッチングできます。directionToHead
の値を検証してください。.north
に等しい場合は、「多くの惑星は北にあります」と出力します。.south
に等しい場合は、「ペンギンに気をつけて」と出力してください」switch
文で全てのケースを網羅する必要があります。.west
の case
を省略した場合、このコードはコンパイルできません。これによって、列挙ケースが誤って省略できないようにします。case
を並べることが適切でない場合は、明示的に対処されていないケースをカバーする default
のケースを提供できます。:CaseIterable
を記述します。Swift は、全てのケースのコレクションを列挙型の allCases
プロパティとして提供しています。次に例を示します:Beverage.allCases
を記述して、列挙型 Beverage
の全てのケースを含むコレクションにアクセスします。allCases
は、他のコレクションと同じように使用できます。コレクションの要素は列挙型のインスタンスで、今回は Beverage
の値です。上記の例では、ケースの数をカウントし、下記の例では、for
ループを使用して全てのケースを繰り返し処理しています。Planet.earth
に設定し、後でこの値を確認できます。ただし、これらのケース値と一緒に他の型の値を保持できると便利な場合があります。この追加情報は_関連値_と呼ばれ、コードでそのケースの値を使用する度に異なります。discriminated unions
、tagged unions
、または variants
として知られています。0〜9
の数字を使用する UPC 形式の 1D バーコードでラベルが付けられています。各バーコードには番号システムの数字があり、その後に 5 つのメーカーコード数字と 5 つの製品コード数字が続きます。これらの後にチェックディジットが続き、コードが正しくスキャンされたことを確認します。Barcode
と呼ばれる列挙型を定義します。これは、upc
の値と (Int、Int、Int、Int)
型の関連値、または qrCode
の値と String
型の関連値、のいずれかを取ることができます」Int
値または String
値を提供するものではなく、Barcode.upc
または Barcode.qrCode
と等しい場合に Barcode
の定数および変数が格納できる関連値の型を定義しているだけです。Barcode
を作成します。(8,85909, 51226, 3)
を持つ Barcode.upc
の値を代入して、productBarcode
という新しい変数を作成します。Barcode.upc
とその整数値は、新しい Barcode.qrCode
とその文字列値に置き換えられます。Barcode
の定数と変数は、.upc
または .qrCode
のいずれかを(関連値とともに)格納できますが、一度に格納できるのはそのうちの 1 つだけです。switch
文を使用して様々なバーコード型を確認できます。ただし、今回は、関連値が switch
文の一部として抽出されます。switch
のケースの本文内で使用するために、関連値を定数(let
プレフィックス)または変数(var
プレフィックス)として抽出します。var
または let
を付けるだけで問題ありません:ASCIIControlCharacter
と呼ばれる列挙型の Raw Value は、Character
型で定義されており、一般的な ASCII 制御文字のいくつかが設定されています。Character
値は、Strings and Characters(文字列と文字)で説明しています。NOTE Raw Valueは、関連値と同じではありません。上記の3つの ASCII コードのように、コードで列挙型を最初に定義するときに、Raw Value は事前入力された値に設定されます。特定の列挙ケースの Raw Value は常に同じです。関連値は、列挙ケースに基づいて新しい定数または変数を作成するときに設定され、作成する度に異なる可能性があります。
0
です。Planet
の列挙型を改良したもので、太陽からの各惑星の順序を表す整数の Raw Value が含まれています。Planet.mercury
の明示的な Raw Value は 1
で、Planet.venus
の暗黙的な Raw Value は 2
です。CompassPoint
列挙型を改良したもので、各方向の名前を表す文字列の Raw Value が含まれています。CompassPoint.south
には "south"
という暗黙の Raw Value があります。rawValue
プロパティを使用して列挙ケースの Raw Value にアクセスします。rawValue
と呼ばれるパラメータとして)受け取り、列挙型または nil
のいずれかを返すイニシャライザを自動的に提供します。このイニシャライザを使用して、列挙型の新しいインスタンスを作成することができます。7
から天王星を識別します。Int
値が惑星に一致するわけではありません。このため、Raw Value のイニシャライザは常にオプショナルの列挙型を返します。上記の例では、possiblePlanet
は Planet?または オプショナルの
Planet`型です。NOTE 全ての Raw Value が列挙型を返すわけではないため、Raw Valueイニシャライザはnil
を返す可能性があります。詳細については、Failable Initializers(失敗可能イニシャライザ)を参照ください。
11
の惑星を見つけようとすると、Raw Value のイニシャライザによって返されるオプショナルの Planet
は nil
になります。11
の惑星にアクセスしようとします。if let somePlanet = Planet(rawValue: 11)
は、オプショナルの Planet
を作成し、取得できる場合は、somePlanet
をそのオプショナルの Planet
の値に設定します。この場合、位置が 11
の惑星を取得することはできないため、代わりに else
の分岐が実行されます。indirect
を記述します。これにより、コンパイラに indirect
のネストがあることを伝えることができます。indirect
を記述して、関連値を持つ全てのケースを indirect
にすることもできます。addition
と multiplication
のケースには、同じく算術式を関連値として格納しています。これらの関連値により、式をネストできます。例えば、式 (5 + 4) * 2
には、乗算の右側に数値があり、乗算の左側に別の式があります。データがネストしているため、データを格納する列挙ケースもネストをサポートする必要があります。つまり、再帰的でなければなりません。下記のコードは、(5 + 4) * 2
に対する ArithmeticExpression
の再帰的列挙を作成する方法を示しています。addition
または multiplication
を評価します。