次の例では、ブラックジャックのゲームで使用されるトランプのカードをモデル化した構造体 BlackjackCard を定義しています。構造体 BlackJack は、ネストされた列挙型 Suit と Rank を含んでいます。

ブラックジャックでは、Ace のカードは 1 または 11 のどちらかの値になります。この特性は、列挙型 Rank にネストされた構造体 Values で表現されています。

struct BlackjackCard {

    // ネストされた列挙型 Suit
    enum Suit: Character {
        case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
    }

    // ネストされた列挙型 Rank
    enum Rank: Int {
        case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten
        case Jack, Queen, King, Ace
        struct Values {
            let first: Int, second: Int?
        }
        var values: Values {
            switch self {
            case .Ace:
                return Values(first: 1, second: 11)
            case .Jack, .Queen, .King:
                return Values(first: 10, second: nil)
            default:
                return Values(first: self.rawValue, second: nil)
            }
        }
    }

    // BlackjackCard のプロパティとメソッド
    let rank: Rank, suit: Suit
    var description: String {
        var output = "suit is \(suit.rawValue),"
        output += " value is \(rank.values.first)"
        if let second = rank.values.second {
            output += " or \(second)"
        }
        return output
    }
}

列挙型 Suit は、記号を示す Character の raw 値と併せて、4 つあるトランプのマークを表現しています。

列挙型 Rank は、値を示す Int の raw 値と併せて、13 あるトランプのランクを表現しています。(Jack, Queen, King, Ace のカードには、この Int の raw 値は使用されません。)

上述のように、列挙型 Rank にはさらにネストされた構造体 Values が定義されています。この構造体では、ほとんどのカードは値が 1 つで、Ace には値が 2 つあることを表現しています。これを表現するために、構造体 Values に 2 つのプロパティを定義しています。

  • firstInt 型
  • secondInt? 型(オプショナル Int

また、Rank には構造体 Values のインスタンスを返すコンピューテッドプロパティ values が定義されています。このコンピューテッドプロパティは、カードのランクを評価し、ランクをもとに適切な値を持つ新しい Values インスタンスを初期化します。JackQueenKingAce では特別な値を使用します。数のカードでは、ランクの Int の raw 値を使用します。

構造体 BlackjackCard 自体には 2 つのプロパティ rank と suit があります。また、カードの名前と値の説明を構築するために、 rank と suit に保持している値を使用するコンピューテッドプロパティ description を定義しています。description プロパティは、表示する 2 つ目の値があるかをチェックするためにオプショナルバインディングを使用し、その場合には 2 つ目の値の説明を加えます。

BlackjackCard は独自のイニシャライザを持たない構造体であるため、Memberwise Initializers for Structure Types で説明されているように、暗黙のメンバーワイズイニシャライザがあります。新しい定数 theAceOfSpades を初期化するために、このイニシャライザを使用することができます。

let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
print("theAceOfSpades: \(theAceOfSpades.description)")
// "theAceOfSpades: suit is ♠, value is 1 or 11" と出力

Rank と Suit は BlackjackCard にネストされていますが、これらの型をコンテキストから推論することができるため、このインスタンスの初期化では、ケース名(.Ace と .Spades)だけで列挙型のケースを参照することができます。上の例では、スペードの Ace には 1 と 11 の値があることを、description プロパティが正しく報告しています。


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.