열거형은 클래스, 구조체의 기능을 보조하기위해 사용되기도 한다.
유사하게, 복잡한 타입 내에서 클래스와 구조체를 정의하는 것이 편리할 때도 있다.
Swift 의 nested type 을 사용하면 타입 내부에 클래스,열거형, 구조체등을 중첩하여 정의할 수 있다.
타입 내의 다른 타입을 중첩하려면, 해당 타입의 중괄호 {} 내부에 타입을 새로이 정의하면 된다.
Nested Types in Action
아래의 구조체 BlackjackCard 는 블랙잭 게임을 모델링하는 구조체이다.
블랙잭 게임에서 Ace 카드는 1 또는 11의 값을 가지며
이러한 특징은 Values 라는 구조체에 의해서 나타내어지며
이 Values 구조체는 Rank 열거형 내부에 중첩되어 있다.
struct BlackjackCard {
// nested Suit enumeration
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 {
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
}
}
let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("theAceOfSpades: \(theAceOfSpades.description)")
// Prints "theAceOfSpades: suit is ♠, value is 1 or 11"
Swift
복사
Suit 라는 열거형은 카드의 4가지 모양을 나타낸다. 각각의 case 는 Character 타입의 raw value 를 갖는다.
Rank 라는 열거형에는 카드의 우선순위가 저장된다. 우선순위는 13가지로 구분되며, 각각의 case 는 Int 타입의 raw value 를 갖는다.
위에 언급한 바와 같이 Rank 는 Values 라는 중첩된 구조체를 지니며,
이 구조체는 대부분의 카드가 하나의 값을 지니지만, Ace 카드는 두개의 값을 지닌 다는 사실을 캡슐화한다.
•
first, of type Int
•
second, of type Int?, or “optional Int”
Rank 는 또한 values 라느 계산프로퍼티를 가진다.
이 계산 프로퍼티는 Values 구조체의 인스턴스를 리턴한다.
이 계산 프로퍼티는 카드의 우선순위에 따라 적적한 값을 가지는 Values 인스턴스를 생성한다.
BlackjackCard 구조체는 rank 와 suit 라는 두개의 프로퍼티를 가지며, description 이라는 한개의 계산 프로퍼티를 가집니다.
description 프로펕티는 옵셔널 바인딩을 통해 second 값이 존재하는 지 확인하고 존재한다면, description 에 second 값에 대한 추가적인 설명을 추가합니다.
Referring to Nested Types
타입 정의 바깥에서 중첩 타입을 사용하기 위해서는 ,
중첩되어 있는 타입의 이름과 함께 접근해 주어야합니다.
let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
// heartsSymbol is "♡"
Swift
복사
Suit 라는 타입을 중첩 타입 외부에서 사용하고자 한다면
중첩으로 정의되어 있는 타입 BlackjackCard 를 앞에 작성하여 사용하면 됩니다.