티스토리 뷰

반응형

이번 글에서는 Swift 공식 문서의 19번째 단원인 Nested Types을 읽고 정리한 글을 쓰려고 한다.

 

Apple Swift 공식 문서 19단원 - Nested Types

Nested Types

열거형은 가끔 특정 클래스와 구조체의 기능을 지원하기 위해 생성된다. 이와 비슷하게 복잡한 타입의 클래스와 구조체를 사용할 때 그 안에서 모든 것을 구현하는 것이 편리할 수 있다. 즉 해당 블록 안에 또 다른 열거형, 클래스, 구조체를 중첩해서 정의할 수 있다는 말이다. 다른 타입 내에 타입을 중첩하려면 지원하는 타입의 외부 중괄호 안에 정의를 작성하면 된다.


Nested Types in Action

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
    }
}

위의 코드가 중첩 타입을 사용하는 예제 코드이다. 이 코드는 블랙잭 게임을 나타내는 것으로 카드를 나타내는 BlackjackCard라는 구조체가 정의되어 있다. 이 구조체 안에는 Suit, Rank 열거형이 중첩 타입으로 정의되어있다. 비교적 간단한 Suit 열거형은 직관적으로 이해할 수 있으니 넘어가도록 하고 Rank 열거형을 살펴보자. 참고로 여기서 Suit 열거형은 카드의 모양을 나타낸다.

 

Rank 열거형은 카드의 숫자값을 나타내는 값이다. Rank 열거형 안에는 Values 구조체가 또 다른 중첩 타입으로 정의되어있다. 이는 예를 들어 ace 카드는 1, 11로 사용될 수 있는데 이러한 경우를 표현하기 위한 구조체이다. 이를 계산 프로퍼티인 values에서 각 값에 맞게 계산해주면 된다. 예시로 사용된 ace카드를 들어보자. BlackjackCard의 프로퍼티인 description에서 만약 Rank가 ace라면 Rank의 Values 구조체에 first, second 값에 1, 11이 할당된다. 이를 사용하여 description 프로퍼티를 구성하게 되는데 second 값은 옵셔널 타입이므로 없으면 처리되지 않는다. 하지만 ace는 가지고 있기 때문에 처리되어 결과가 나오게 된다.

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, Values의 이름을 짧게 유지할 수 있다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함