次の例では、ブラックジャックのゲームで使用されるトランプのカードをモデル化した構造体 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 つのプロパティを定義しています。
first
,Int
型second
,Int?
型(オプショナルInt
)
また、Rank
には構造体 Values
のインスタンスを返すコンピューテッドプロパティ values
が定義されています。このコンピューテッドプロパティは、カードのランクを評価し、ランクをもとに適切な値を持つ新しい Values
インスタンスを初期化します。Jack
、Queen
、King
、Ace
では特別な値を使用します。数のカードでは、ランクの 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.