250x250
반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

개발자 수니

[iOS/Swift/Basic] 열거형 Enumerations : 항목 순회 - CaseIterable 본문

iOS - Swift

[iOS/Swift/Basic] 열거형 Enumerations : 항목 순회 - CaseIterable

개발자 수니 2024. 1. 24. 20:42
728x90
반응형

📑 이전글

[iOS/Swift/Basic] 열거형 Enumerations : 원시값 Raw Values, 연관값 Associated Values

CaseIterable

  • Swift 프로그래밍 언어에서 제공하는 프로토콜
  • 이 프로토콜을 채택한 열거형(Enumeration)은 모든 항목(case)을 순회할 수 있다.

allCases

  • CaseIterable을 채택한 열거형의 모든 항목(case)를 얻을 수 있다.

CaseIterable 활용한 열거형(Enumeration)의 항목 순회

  • 기본형
// CaseIterable Protocol을 채택한 Enumeration
enum Color: CaseIterable {
    case red, green, blue, yellow
}

// CaseIterable 프로토콜을 채택했기 때문에 allCases 속성을 통해 모든 케이스를 얻을 수 있다.
let allColors = Color.allCases
for color in allColors {
    print(color)	// red green blue yellow
}

 

단순한 열거형(Enumeration)에는 CaseIterable을 채택해 주는 것만으로 allCases 프로퍼티를 사용할 수 있지만,

조금 복잡해지는 열거형(Enumeration)의 경우 allCases 프로퍼티를 직접 구현해 주어야 한다.

 

  • 플랫폼별 사용 조건을 추가하는 경우 : available 속성을 갖는 열거형(Enumeration)
// 플랫폼별 사용 조건을 추가하는 경우 : available 속성을 갖는 열거형(Enumeration)
enum Color: CaseIterable {
    case red, green, blue, yellow
    @available(iOS 13.0, *)
    case white

    // allCases 프로퍼티를 직접 구현
    static var allCases: [Color] {
        let all: [Color] = [.red, .green, .blue, .yellow]
        #if os(iOS)
        return all + [.white]
        #else
        return all
        #endif
    }
}

let allColors = Color.allCases
for color in allColors {
    print(color)	// 실행환경에 따라 다른 결과
}

 

  • 연관 값(Associated Values)을 갖는 열거형(Enumeration)의 경우
enum Burger: CaseIterable {
    case bulgogi
    case shrimp
    case cheese
}

enum Drink: CaseIterable {
    case coke
    case fanta
}

// Associated Values을 가지는 Enumerations
enum Menu: CaseIterable {
    case set(burger: Burger, drink: Drink)
    case single(burger: Burger)

    static var allCases: [Menu] {
        return Burger.allCases.reduce([]) { (result, burger) -> [Menu] in
            result + Drink.allCases.map { (drink) -> Menu in
                Menu.set(burger: burger, drink: drink)
            }
        }
        + Burger.allCases.map(Menu.single)
    }
}

print(Menu.allCases.count)  // 9 : 모든 경우의 수
print(Menu.allCases)        // 모든 경우의 항목(case) 컬렉션

 

 

처음 열거형(Enumeration)을 정의하고 allCases를 구현한 이후에 항목(case)를 추가할 일이 생긴다면 꼭 잊지 말고 allCases를 다시 살펴봐야겠다.

 

 

 

 

🙋🏻‍♀️ 참고

야곰, ⌜스위프트 프로그래밍: Swift5⌟, 한빛미디어(2019)

728x90
반응형
Comments