Associated Values でのバーコードの例は、異なる型の関連値を保持する列挙型のケースを宣言する方法について示しています。関連値に代わる方法として、列挙型のケースにすべて同じ型のデフォルト値(raw 値)をあらかじめ持たせることができます。

次の例では、列挙型のケース名と一緒に ASCII の raw 値を保持しています。

enum ASCIIControlCharacter: Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}

この例では、列挙型 ASCIIControlCharacter の raw 値が Character 型で定義されていて、より一般的な ASCII 制御文字で設定されています。Character 値については、Strings and Characters で説明されています。

raw 値は文字列や文字、あるいは整数や浮動小数点数の型にすることができます。各 raw 値を列挙型の宣言内でユニークにする必要があります。

NOTE
raw 値は関連値と同じではありません。raw 値は、上で見た ASCII コードの例のように、列挙型を定義するときに値をあらかじめ設定します。列挙型の特定のケースが持つ raw 値は、常に同じです。関連値は、列挙型のケースに基づく新たな定数や変数の生成時に設定され、生成のたびに異なる値にすることができます。

暗黙のうちに割り当てられる raw 値

整数または文字列の raw 値を保持する列挙型を扱っているとき、各ケースに対して明示的に raw 値を割り当てる必要はありません。割り当てない場合、Swift が自動的に値を割り当てます。

例えば、raw 値に整数が使用されている場合、各ケースの暗黙値は直前のケースより 1 多い値になります。最初のケースに値が設定されていない場合には、最初の値は 0 になります。

次の列挙型は、前に見た列挙型 Planet の改良版で、太陽からの惑星の順番を表す整数の raw 値が割り当てられています。

enum Planet: Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

この例では、Planet.Mercury が明示的な raw 値 1 で、Planet.Venus が暗黙的な raw 値 2 などと続きます。

raw 値に文字列が使用された場合には、各ケースの暗黙値はケース名のテキストになります。

次の列挙型は、前に見た列挙型 CompassPoint の改良版で、各方角の名称を表す文字列の raw 値が割り当てられます。

enum CompassPoint: String {
    case North, South, East, West
}

この例では、CompassPoint.South の暗黙的な raw 値は "South" となります。

rawValue プロパティを利用して列挙型のケースの raw 値にアクセスします。

let earthsOrder = Planet.Earth.rawValue
// earthsOrder は 3

let sunsetDirection = CompassPoint.West.rawValue
// sunsetDirection は "West"

raw 値から初期化

raw-value 型で列挙型を定義する場合、列挙型は自動的に(パラメータ rawValue として)raw 値の型の値を受け取り、列挙型の case か nil を返すイニシャライザを受け取ります。列挙型の新しいインスタンスを生成するために、このイニシャライザを使用することができます。

次の例では、raw 値の 7 から、Uranus と特定されます。

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet は Planet? 型の Planet.Uranus

あらゆる Int 値に対応する惑星があるわけではないため、raw 値のイニシャライザは常にオプショナルな列挙型のケースを返します。この例では、possiblePlanet は Planet?(オプショナル Planet)型になります。

NOTE
raw 値のイニシャライザは、あらゆる raw 値が列挙型のケースを返せるわけではないため、失敗する可能性があるイニシャライザです。詳しくは Failable Initializers を確認してください。

ポジション 9 の惑星を見つけようとした場合、raw 値のイニシャライザが返すオプショナル Planet 値は nil になります。

let positionToFind = 9
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .Earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// "There isn't a planet at position 9" と出力

この例では、raw 値 9 の惑星にアクセスするために、オプショナルバインディングを使用しています。if let somePlanet = Planet(rawValue: 9) の文はオプショナル Planet を生成し、取得できた場合にはそのオプショナル Planet の値を somePlanet に設定しています。このケースでは、ポジション 9 の惑星を取得することはできないため、代わりに else 側の分岐が実行されます。


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.