大器晩成

중첩된 타입 (Nested Types) 본문

iOS/Swift 문법

중첩된 타입 (Nested Types)

zerobugpark 2025. 2. 24. 01:49

 

  • 열거형은 특정 클래스 도는 구조체의 기능을 지원하기 위해 생성됩니다. 유사하게 더 복잡한 타입의 컨텍스트 내에서 허용하기 위해 구조체와 일반적으로 특정 타입과 함께 사용되는 프로토콜을 정의하는 것이 편리할 수 있습니다. 스위프트는 중첩된 타입을 정의할 수 있으며, 타입의 정의 내에서 열거형, 구조체, 그리고 프로토콜과 같은 타입을 중첩할 수 있습니다.
class Week {
    
    struct DayOfTheWeek {
        
        
        enum Day  {
            case monday
            case tuesday
            case wednesday
            case thursday
            case friday
            case saturday
            case sunday
            
        }
        
        var day: Day
    }
}

let monday = Week.DayOfTheWeek(day: .monday)
  • Day는 요일과 관련 있기 때문에, 요일 구조체 안에 선언되어 있습니다.
  • 특정 타입 내에서만 사용하기 위해서 사용합니다.
  • 타입 간의 연관성을 명확히 구분하고, 내부 구조를 디테일하게 설계가 가능합니다.
  • 실제 개발자가 사용하는 경우보다 애플 내부에 구현되어 있는 경우가 많습니다.
  • ex. DataFormatter.Style.full

 

Apple 공식문서 예제

  • 블랙잭은 카드 합이 21을 넘지 않으면서, 딜러보다 높은 점수를 만들면 이기는 카드 게임입니다
struct BlackjackCard {

    // nested Suit enumeration
    enum Suit: Character { // 원시값(rawValue)사용
        case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
    }

    // nested Rank enumeration
    enum Rank: Int { // 원시값(rawValue)사용
        case two = 2, three, four, five, six, seven, eight, nine, ten
        case jack, queen, king, ace
        
        //Values 타입을 정의 및 두개의 프로퍼티 사용
        // 에이스는 1 또는 11을 의미하기 때문에, second가 존재
        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 { // ace일 때만 실행
            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"

https://bbiguduk.gitbook.io/swift/language-guide-1/nested-types

 

중첩된 타입 (Nested Types) | Swift

Last updated 12 months ago

bbiguduk.gitbook.io

 

중첩 타입을 사용하는 목적

  • 중첩타입으로 선언된 API를 볼 줄 알면 좋다.
    - DateFormatter.Style.full (중간 타입에 대문자가 나오면, 중첩타입입니다.)
  • 실제 앱을 만들 때 중첩 선언을 잘 활용해야 합니다. (타입 간의 관계 명확성)
  • 하나의 타입의 내부 구조(계층 관계 등)를 디테일하게 설계가 가능합니다

 

 

728x90