본문 바로가기

Swift/꼬꼬무

Nested Types (중첩 타입)

다른 타입의 범위 안에 정의된 타입

 

열거형은 대게 특정 클래스나 구조체의 기능을 지원하기 위해서 생성됩니다.

유사하게 더 복잡한 타입의 컨텍스트 내에서 사용되기 위해서 유틸리티 클래스나 구조체를 정의하는 것이 더 편리할 수 있습니다.

 

간단하게 특정 타입 내에서만 사용되는 클래스나, 구조체 등을 전역으로 만들어서 사용하는게 아니라 필요한 컨텍스트 내에서 정의해서 사용하는 것이 더 유용한 경우!!

 

이를 위해 Swift에서는 중첩된 타입(nested types)을 정의할 수 있고, 지원하는 타입의 정의 내에서 열거형, 클래스, 구조체를 중첩할 수 있습니다.

Nested Types는

  • 다른 타입 내에서 타입을 중첩하려면 지원하려는 타입의 중괄호 내에 정의해야 합니다.
  • 필요한 만큼 중첩할 수 있습니다.

 

예제를 통해 볼까요

Nested Types in Action

아래 예제에서 블랙잭 게임을 위한 BlackjackCard 구조체를 정의합니다.

BlackjackCard 구조체는 두개의 중첩 열거형 타입인 Suit와 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
    }
}

 

 

Suit 열거형은 기호를 나타내는 Character 값으로 4개의 심볼을 표현합니다.

Rank 열거형은 Int형으로 13개의 숫자를 나타냅니다.

 

Rank 열거형은 Values라는 중첩된 구조체를 정의합니다. Values 구조체는 2개의 프로퍼티를 정의합니다.

  • Int 타입의 first
  • Int? 타입의 second

 

Rank는 Values 구조체 인스턴스를 반환하는 values 라는 계산 프로퍼티도 정의합니다.

 

BackjackCard는 사용자 지정 이니셜라이저가 없기 대문에 멤버별 이니셜라이저를 가지고 있습니다.

let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("theAceOfSpades: \\(theAceOfSpades.description)")
// Prints "theAceOfSpades: suit is ♠, value is 1 or 11"

 

 

Referring to Nested Types (중첩된 타입의 참조)

외부에서 중첩된 타입을 사용하기 위해서는 중첩된 타입의 이름을 접두사로 사용합니다.

let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
// heartsSymbol is "♡"

위 예제에서 Suit, Rank, Value의 이름은 정의된 컨텍스트 내에서 한정되기 때문에 짧게 사용할 수 있습니다.

'Swift > 꼬꼬무' 카테고리의 다른 글

Trailing Closures (후행 클로저)  (1) 2023.10.11
Closures (클로저) - Closure Expressions  (0) 2023.09.20
Error Handling  (0) 2023.08.10
Opaque and Boxed Types  (0) 2023.08.09
Generic Subscripts (제네릭 서브 스크립트)  (0) 2023.08.07