-
Swift - Enumeration CaseIterableProgramming/Swift 2021. 10. 18. 11:15
안녕하세요! Beepeach입니다 :)
오늘 공부해볼 주제는 CaseIterable 프로토콜입니다.
가끔 enum case들을 collection으로 사용해야 할 때가 있습니다.
case들만 따로 모아서 직접 array를 만들어도 되지만 Swift에서 제공하는 기능을 통해 간단하게 생성할 수 있습니다.
그럼 같이 보도록 할게요!!
CaseIterable
CaseIterable 프로토콜을 채용하면 제공되는 프로퍼티를 통해서 collection을 쉽게 만들 수 있습니다. (프로토콜에 대해서는 나중에 다루도록 하겠습니다.)
주로 associated value가 없는 enum에 사용합니다. (이유는 뒤에서 설명할게요!)
그럼 먼저 사용방법을 보겠습니다.
간단하게 enum type이름 옆에 :과 CaseIterable을 적어주면 됩니다.
그럼 allCases 프로퍼티를 통해서 case들로 이루어진 array를 얻을 수 있습니다.
Collection이기 때문에 당연히 for-in 문에서도 사용이 가능합니다.
아주 간단하죠???
만약 raw value와 같이 사용하고 싶다면 rawValue의 타입을 먼저 적어주면 됩니다.
예제를 보겠습니다.
아주 간단하죠???
그런데 문제가 있습니다. 주로 associated value가 없는 enum과 사용한다고 했죠???
왜 그럴까요?? 한번 알아보도록 하겠습니다.
Associated value와 CaseIterable
(이 부분은 protocol에 대해서 모르신다면 넘어가시는 게 좋습니다!!)
Associated value를 추가했더니?!
이러한 에러가 발생합니다.
으음.. Beverage 타입이 CaseIterable 프로토콜을 채용하지 않았다고 하네요.
그리고 프로토콜이 [Beverage] 타입의 allCases 프로퍼티를 원한다고 되어있습니다.
넵 사실 allCases는 Required 프로퍼티였습니다.
지금까지 정의하지 않고 사용했던 건 컴파일러가 알아서 구현을 해줬기 때문입니다.
하지만 associated value를 가지는 enum은 인스턴스를 생성할 때 associated value를 초기화해야 하기 때문에 알아서 구현해주지 못합니다.
기본적인 초기화를 우리가 해야 하는 거죠.
그럼 직접 해볼까요??
allCases로 만들어질 배열에 직접 초기화시킨 case들을 집어넣었더니 에러가 사라졌습니다.
단지 associated value 때문에 컴파일러가 자동으로 초기화를 못하게 되었으니 우리가 직접 해주면 됩니다.
하지만 굳이 잘 안 쓰는 데는 이유가 있겠죠??
count를 얻으려는 게 아니라면 내가 초기화시켜준 인스턴스의 값이 들어가게 되므로 실제로 코드에 사용하는 인스턴스와는 다른 값이게 됩니다.
그냥 이렇게 하는구나만 알고 가시면 될 거 같네요!
참고사항
https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Value type vs Reference type (0) 2021.10.23 Swift - Struct & Class (0) 2021.10.20 Swift - Enumeration Associated Value (0) 2021.10.16 Swift - Enumeration (열거형) (0) 2021.10.15 Swift - KeyValuePairs (0) 2021.10.14