지원하는 타입의 정의 내에서 클래스 및 구조체, 열거형을 중첩할 수 있다
블랙잭 게임에서 사용되는 카드를 모델링한 BlackjackCard라는 구조체를 정의
→ 이 기능은 Rank 열겨형의 중첩 타입인 구조체의 Values라고 하는 프로퍼티로 표현됨.
struct BlackjackCard {
// nested Suit enumeration
// struct 안에 enum이 들어갈 수 있습니다.
enum Suit: Character {
case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
}
// nested Rank enumeration
enum Rank: Int {
case two = 2, three, four, five, six, seven, eight, nine, ten
case jack, queen, king, ace
struct Values { // enum안에 struct가 들어가는 것도 가능합니다.
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 properties and methods
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
}
}
→ 이런 식으로 구조체 안에 열거형, 열거형 안에 구조체가 중첩될 수 있다.
(이 구조는 대부분의 카드가 하나의 값만 갖지만, Ace 카드는 두 개를 갖는데 이것을 캡슐화)