열거형은 특정 클래스 또는 구조체의 기능 지원을 위해서 생성된다. 스위프트는 중첩된 타입을 정의할 수 있으며, 지원하는 타입의 정의 내에서 열거형, 클래스 그리고 구조체를 중첩할 수 있다.
struct BlackjackCard {
//nested Suit enumeration
enum Suit : Character {
case spades = "S", hearts = "H", diamonds = "D", clubs = "C"
}
//nsted Rank enumeration
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)
}
}
let rank : Rank, suit : Suit
var description : String {
var output = "suit is \(suit.rawValue),"
output += "value is \(rank.value.first)"
if let second = rank.values.second {
output += "or \(second)"
}
return output
}
}
let theAceOfSpades = BlackjackCard(rank : .ace, suit : .spades)
print(\(theAceOfSpades.description))
//다음과 같이 구조체 안에 값을 지정해주기 위한 열거형과 새로운 구조체를 다시 지정하여 자유롭게 반환값을 이용 가능하다.
let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
//다음과 같이 입력하면 "heart"를 출력한다.