중첩 타입 (Nested Types)

Swift ) Nested Types

중첩타입?

지원하는 타입의 정의 내에서 클래스 및 구조체, 열거형을 중첩할 수 있다

예제

블랙잭 게임에서 사용되는 카드를 모델링한 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 카드는 두 개를 갖는데 이것을 캡슐화)