Danny의 iOS 컨닝페이퍼
article thumbnail

프로토콜 CaseIterable

공식문서 는 이쪽에 있습니다.

설명이 친절하니 한 번은 들어가서 보세요.

 

일단 결론은 열거형의 각각 모든 case들을 한데 묶어서

컬렉션인 배열로 만들어 줍니다.

 

각가의 요소를 배열로 바꾸어 준다니 유연하게 사용이 가능해질 거 같네요!

 

내부 구조를 한번 봅시다.

public protocol CaseIterable {

    /// 타입의 모든 값을 콜렉션(배열로) 나타내는 타입입니다.
    associatedtype AllCases : Collection = [Self] where Self == Self.AllCases.Element

    /// 콜렉션(배열)의 모든 값을 나타냅니다.
    static var allCases: Self.AllCases { get }
}

사용하는 곳을 열거형이라 생각하면

 

associatedtype AllCases

 

열거형 타입 == 열거형의 각각의 모든 요소

(서로 같다면)

 

타입열거형 타입배열로 사용한다고 하네요.

 

또한 속성 allCases로 접근하면 [열거형 타입]이 나온다는 걸 알 수 있습니다.

 

사실 속성 이름만 봐도 All Cases 즉, 모든 케이스들입니다.

자세한 내부 구조는 모르지만 대략 이런 식으로 동작한다고 유추 가능합니다.

 

 

사용 방법

이제 프로토콜 CaseIterable가 어떤 건지 알았으니 사용해 볼까요?

 

열거형(enum)으로 SmartPhone을 만들어 주고

프로토콜 CaseIterable을 채택해 줬어요.

enum SmartPhone: CaseIterable {
    case apple
    case samsung
    case motorola
    case xiaomi
}

 

바로 allCases를 호출해 봅시다.

현재 타입은 배열[열거형의 타입]인걸 확인이 가능하네요.

let phones: [SmartPhone] = SmartPhone.allCases

// [apple, samsung, motorola, xiaomi]

 

배열이니 당연히 서브크립트로도 접근이 가능하겠네요.

phones[0]		// apple
phones[1]		// samsung
phones[2]		// motorola
phones[3]		// xiaomi

 

또한 이런 식으로 원시값 사용도 가능합니다.

enum SmartPhone: String ,CaseIterable {
    case apple
    case samsung
    case motorola
    case xiaomi
}

 

배열이므로 고차함수 사용도 가능하겠죠?!

rawValue로 접근해서 String값을 얻어보겠습니다.

let phones = SmartPhone.allCases.map { $0.rawValue }
print(phones)

// ["apple", "samsung", "motorola", "xiaomi"]

 

프로토콜만 채택해 주면 별로 추가 구현 없이 간단히 사용이 가능하네요!

 

지금까지 열거형을 간편하게 배열로 바꿔주는 
프로토콜 CaseIterable에 대하여 알아보았습니다.

부족한 설명이지만, 조금은 이해 가셨나요?

틀린 내용이 있다면 언제든지 지적해 주시면 감사히 받겠습니다. 🫠
읽어주셔서 감사합니다 😃

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!