❓ Enum(2)
안녕하세요!
이전에는 Enum이란 뭐고 어떻게 사용하는지, 원시값 RawValue가 뭔지 알아봤습니다!
오늘은 Enum의 연관값이랑 CaseIterable이라는 프로토콜을 채택해서 어떻게 활용할 수 있는지 알아볼게요🔥
🧐 연관값은 왜 필요할까
이전에 사용했던 예제를 살펴보면 각 OS에 대해 명시하고 있기는 하지만 각 OS가 몇 버전인지는 명시해주고 있지 않습니다
enum AppleOS {
case iOS
case MacOS
case TvOS
case WatchOS
}
그런데 이제는 iOS이면서 최신버전인 17.5일 때, 무언가를 처리하고 싶은 겁니다
그러면 이런 식으로 사용하게 되겠죠?
switch AppleOS {
case .iOS:
if version == 17.5 {
}
}
그런데 세상에 iOS버전이 17.5만 있는 건 아니잖아요😅
그럼 또 결국 우리가 처음 마주했던 문제인 수많은 if-else문을 마주하게 될 겁니다
그리고 이러한 문제를 해결하기 위해! 열거형을 선택해서 사용할 때 값을 함께 던져줄 수 있는 연관값을 사용하게 됩니다!
❓ 연관값이 있는 열거형
만약 지금처럼 iOS라고 OS타입을 명시할 때, String타입으로 버전까지 함께 받아오고 싶다면
enum AppleOS {
case iOS(version: String)
}
이렇게 iOS라는 case옆에 튜플 형식으로 version을 String타입으로 받아올거야하고 명시해 줄 수 있습니다
그리고 만약 업데이트 날짜까지 함께 받아오고 싶다면?
이런 식으로 연관값을 연달아서 선언해 줘서 Date타입으로 updateDate까지 받아올 수 있습니다!
enum AppleOS {
case iOS(version: String, updateDate: Date)
}
즉, 연관값은 케이스를 사용할 때 받아오고자 하는 값들을 각각의 케이스 옆에 튜플 형태로 구성해 주는 것을 의미합니다
case 사용할 케이스명(받아올 데이터명: 받아올 데이터 타입)
그럼 이 연관값을 어떻게 사용하는지 알아야겠죠 🤗
방법은 간단합니다!
열거형의 케이스를 정의해 줄 때, 방금 정의해 둔 연관값이 함께 자동으로 뜨니까
선언해 둔 연관값의 타입에 맞춰 값을 채워주기만 하면 됩니다!
그리고 당연하게도 연관값을 무시해 줄 수도, 생략해 줄 수도 있습니다
❓CaseIterable을 채택한 열거형
아시는지 모르겠지만 열거형은 프로토콜을 채택해 줄 수도 있습니다
그중에서 가장 대중적으로 사용되는 게 CaseIterable입니다
CaseIterable은 모든 케이스들로 하나의 배열로 만들어준다는 특징을 가집니다
우선 채택방법은 평소에 프로토콜을 채택해 주는 방법과 동일합니다
enum AppleOS: CaseIterable {
case iOS
case MacOS
case watchOS
case TvOS
}
다음으로 AppleOS 열거형을 allCases를 통해 가져오면 아래처럼 [AppleOS] 형태로 값이 들어옴을 확인할 수 있습니다
그리고 현재 allCases라는 상수가 배열 타입이니까 당연히 [0], [1] 이런 식으로 인덱스로 접근해 줄 수도 있겠죠?
또한 이전에 살펴봤던 원시값과 사용해 줄 수도 있습니다
이때, 순서는 꼭꼭! 원시값 타입 다음에 CaseIterable을 채택해줘야 합니다
그럼 이제 모든 케이스의 원시값을 불러올 수 있습니다!
❗️ 연관값을 가진 경우에는..?
하지만 연관값을 가지고 있을 때에는 CaseIterable은 채택해 줄 수 없음을 알아주세요🥲