Search

[Swift 공식 문서] 20. Nested Types

열거형은 클래스, 구조체의 기능을 보조하기위해 사용되기도 한다.
유사하게, 복잡한 타입 내에서 클래스와 구조체를 정의하는 것이 편리할 때도 있다.
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 를 갖는다.
위에 언급한 바와 같이 RankValues 라는 중첩된 구조체를 지니며,
이 구조체는 대부분의 카드가 하나의 값을 지니지만, Ace 카드는 두개의 값을 지닌 다는 사실을 캡슐화한다.
first, of type Int
second, of type Int?, or “optional Int
Rank 는 또한 values 라느 계산프로퍼티를 가진다.
이 계산 프로퍼티는 Values 구조체의 인스턴스를 리턴한다.
이 계산 프로퍼티는 카드의 우선순위에 따라 적적한 값을 가지는 Values 인스턴스를 생성한다.
BlackjackCard 구조체는 ranksuit 라는 두개의 프로퍼티를 가지며, description 이라는 한개의 계산 프로퍼티를 가집니다.
description 프로펕티는 옵셔널 바인딩을 통해 second 값이 존재하는 지 확인하고 존재한다면, descriptionsecond 값에 대한 추가적인 설명을 추가합니다.

Referring to Nested Types

타입 정의 바깥에서 중첩 타입을 사용하기 위해서는 ,
중첩되어 있는 타입의 이름과 함께 접근해 주어야합니다.
let heartsSymbol = BlackjackCard.Suit.hearts.rawValue // heartsSymbol is "♡"
Swift
복사
Suit 라는 타입을 중첩 타입 외부에서 사용하고자 한다면
중첩으로 정의되어 있는 타입 BlackjackCard 를 앞에 작성하여 사용하면 됩니다.