列挙型は enum で定義します。クラスと同様に、列挙型もメソッドを持つことができます。

enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}
let ace = Rank.Ace
let aceRawValue = ace.rawValue
EXPERIMENT
2 つの Rank 値を rawValue で比較する関数を書いてみよう。

この例では、列挙型のデータ型が Int であるため、始めの値だけを指定しています。残りは順に値が代入されます。列挙型のデータ型として文字列や小数を指定することも可能です。列挙型のデータ (raw value) には、rawValue プロパティでアクセスします。

列挙型のインスタンスをデータ (raw value) から生成するには、init?(rawValue:) イニシャライザを使用します。

if let convertedRank = Rank(rawValue: 3) {
    let threeDescription = convertedRank.simpleDescription()
}

列挙型の case 値は、データ (raw value) を表現する手段であり、実際の値でもあります。意味のあるデータ (raw value) が無い場合には、データ (raw value) を省略します。

enum Suit {
    case Spades, Hearts, Diamonds, Clubs
    func simpleDescription() -> String {
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "diamonds"
        case .Clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
EXPERIMENT
スペードとクラブには “black” を返し、ハートとダイヤモンドには “red” を返す color() メソッドを Suit に追加してみよう。

上の例で、Hearts を参照する方法が 2 種類あることに注目してください。定数 hearts に値を代入するとき、Suit.Hearts としてフルネームで参照しています。これは、定数に明示的な型が指定されていないためです。switch のほうでは、省略された .Hearts として参照していますが、self の値が Suit のインスタンスであることがわかっているためです。つまり、値の型がすでにわかっているため、省略できるということです。

構造体は struct で定義します。構造体は、メソッドやイニシャライザを含めて、クラスと同じ振る舞いを多数サポートしています。構造体とクラスの最も重要な相違点は、構造体は常にコピーが渡され、クラスは参照が渡されるという点です。

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
EXPERIMENT
rank と suit の組み合わせをひととおり揃えるメソッドを Card に追加してみよう。

列挙型のインスタンスは、インスタンスに関連する値を持つことができ、同じ列挙型の複数インスタンスが、それぞれ異なる値を持つこともできます。インスタンス生成時に関連する値を渡します。関連する値 (associated value) とデータ (raw value) は異なります。列挙型の raw value は、列挙型の定義時に記述し、すべてのインスタンスで同じ値となります。

例として、サーバから日の出 (sunrise) と日の入 (sunset) の時刻が返されるリクエストを考えてみましょう。サーバは時刻の情報を返すか、エラーを返します。

enum ServerResponse {
    case Result(String, String)
    case Error(String)
}

let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")

switch success {
case let .Result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .Error(error):
    print("Failure...  \(error)")
}
EXPERIMENT
ServerResponse と switch に、3 つ目の case を追加してみよう。

switch の case で、ServerResponse の値から sunrise と sunset をどのように参照しているかに注目してください。


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.