TIL 0112 - 중첩타입

ian·2022년 1월 12일
0

TIL

목록 보기
9/11
post-thumbnail

오늘!

30개 프로젝트로 배우는 iOS 앱개발 을 결제했다..! 개념적인 부분 강의도 얼른 완강하고, 앱 만드는 강의도 완강함과 동시에!
야곰 아카데미 에서 했던 프로젝트를 다시 할 계획을 세웠다.

예를 들어 앨런 강의 1챕터, 패캠 1챕터 병행 이런식..?

이번주까진 살짝 바쁠것 같은데 노력해보겠다(ㅋㅎ;)

잘 할 수 있겠지..? 해야만 한다 ㅠㅠ..................................


중첩 타입을 공부했다.
예를 들어

class Aclass {
    struct Bstruct {
        enum Cenum {
            case aCase   // 열거형에는 케이스 필요
            case bCase
            
            struct Dstruct {
                
            }
        }
        var name: Cenum
    }
}

// 타입 선언과 인스턴스의 생성

let aClass: Aclass = Aclass()
let bStruct: Aclass.Bstruct = Aclass.Bstruct(name: .bCase)
let cEnum: Aclass.Bstruct.Cenum = Aclass.Bstruct.Cenum.aCase     // 열거형은 케이스선택
let dStruct: Aclass.Bstruct.Cenum.Dstruct = Aclass.Bstruct.Cenum.Dstruct()

Aclass 안에 Bstruct 가 있으며, Bstruct 안에는 Cenum 구조체 Dstruct 가 있네요?
되게 복잡하다 싶을텐데.. 타입 간의 연관성을 명확히 구분하고, 내부 구조를 디테일하게 설계하기 위해 중첩 타입을 사용합니다!


되게 Swift 공식 문서에 좋은 예제가 있다. 갖고와봄!

struct BlackjackCard {
    // 중첩으로 선언 타입 ==============================================
    // Suit(세트) 열거형
    enum Suit: Character {     // 원시값(rawValue)사용
        case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
    }
    
    // 순서(숫자) 열거형
    enum Rank: Int {     // 원시값(rawValue)사용
        case two = 2, three, four, five, six, seven, eight, nine, ten
        case jack, queen, king, ace   // (원시값 존재하지만 사용하지 않고자 함 ===> values)
        
        // Values 타입정의 (두개의 값을 사용) //===> 열거형 값(순서)을 이용 새로운 타입을 반환하기 위함
        struct Values {
            let first: Int, second: Int?
        }
        
        // (읽기) 계산 속성 (열거형 내부에 저장 속성은 선언 불가)
        var values: Values {
            switch self {
            case Rank.ace:
                return Values(first: 1, second: 11)    // 에이스 카드는 1 또는 11 로 쓰임
            case .jack, .queen, .king:
                return Values(first: 10, second: nil)  // 10으로 쓰임
            default:
                return Values(first: self.rawValue, second: nil)    // 2 ~ 10까지의 카드는 원시값으로 쓰임
            }
        }
    }
    
    // 블랙잭 카드 속성 / 메서드  =======================================
    // 어떤 카드도, 순서(숫자)와 세트(Suit)를 가짐
    let rank: Rank, suit: Suit
    
    // (읽기) 계산속성
    var description: String {
        get {
            var output = "\(suit.rawValue) 세트,"
            output += " 숫자 \(rank.values.first)"
            
            if let second = rank.values.second {   // 두번째 값이 있다면 (ace만 있음)
                output += " 또는 \(second)"
            }
            return output
        }
    }
}

// A - 스페이드
let card1 = BlackjackCard(rank: .ace, suit: .spades)
print("1번 카드: \(card1.description)")

// 5 - 다이아몬드
let card2 = BlackjackCard(rank: .five, suit: .diamonds)
print("2번 카드: \(card2.description)")

// 정의한 타입을 외부에서 사용하기 위해서는 중첩되어 있는 타입도 붙여야함(강제) ====> 훨씬 명확해짐
let heartsSymbol: Character  = BlackjackCard.Suit.hearts.rawValue
let suit = BlackjackCard.Suit.hearts

이런 식으로 중첩타입을 구현할 수 있겠죠?


학습 키워드

  • 중첩타입

문제점 / 고민한 점

  • 예제를 찾다보니.. 채팅 메신저 예시를 봐서..! 이건 직접 구현해보기!

TIL 시리즈는 막연히 제가 배운 걸 기록하는 공간입니다.


출처:
앨런 swift 문법 마스터 스쿨

profile
디자인씽킹을 하며 iOS 를 공부합니다

0개의 댓글