-
Swift - Enumeration Associated ValueProgramming/Swift 2021. 10. 16. 22:46
안녕하세요 Beepeach입니다 :)
오늘은 지난 포스팅에 이어서 Enumeration의 Associated Value (연관값)에 대해서 공부해 보도록 하겠습니다.
Raw value는 사용할 수 있는 타입이 정해져 있고 모든 case들이 지정한 한 가지 타입으로만 raw value를 가질 수 있었습니다.
하지만 associated value는 타입의 제약이 없고 case마다 타입을 다르게 지정해줄 수도 있으며 원하는 case에만 적용시킬 수 있습니다.
Raw value는 enum을 만들 때 값을 저장했지만 associated value는 인스턴스를 생성할 때 저장합니다.
Associated value와 raw value는 같이 사용할 수 없습니다.
둘 중에 한 가지만 사용 가능합니다.
그럼 associated value를 사용하는 방법을 알아보도록 하겠습니다!
Associated Value
문법은 case 이름 뒤에 ()로 타입을 적어주면 됩니다.
즉 tuple을 적어주면 됩니다.
Named tuple처럼 타입과 이름을 함께 적어주는 것도 가능하고 여러 개를 저장할 수도 있으며 저장하지 않을 수도 있습니다.
그럼 예시를 하나 들어보겠습니다.
교통수단을 enum으로 만들었습니다.
서로 다른 type들이 할당되어있는 것을 확인할 수 있습니다.
마지막 airplane을 보면 두 값이 무엇을 의미하는지 모르겠죠??
가독성을 좋게 하기 위해서는 name과 type을 같이 적어주는 게 좋습니다.
Enumeration은 switch랑 자주 쓰인다고 했었죠??
Associtaed value을 switch문과 사용해보도록 하겠습니다.
음.. 많이 어려워 보일 수도 있는데 하나씩 살펴보면 어렵지 않습니다.
첫 번째 case는 언제 실행될까요???
taxi의 numbe가 "12가 1234"일때만 실행이 됩니다.
세 번째 case를 보면 bus의 number 대신 _ (wildcard pattern)을 사용했습니다.
그렇다면 number는 상관이 없고 광역버스 여부만 확인한다는 의미가 됩니다.
네 번째 case처럼 아무것도 적지 않으면 subway case이기만 하면 실행이 됩니다.
다섯, 여섯 번째 case는 바로 뒤에서 알아볼 Enumeration case pattern이라는 겁니다.
그건 뒤에서 설명할게요!
이전에는 모든 case를 매치시키면 default문이 필요가 없었습니다.
그런데 얼핏 보면 taxi, bus, subway, airplane 모든 case가 들어가 있는 거 같은데 default를 적어줬습니다.
만약 default가 없다면 모든 switch가 exhaustive 되지 않았다고 나옵니다.
왜 그럴까요??
잘 생각해보면 모든 가능성을 처리하지 못했습니다.
taxi인데 "12가 1234"가 아니라면??
bus인데 isRed가 false라면??
그렇기 때문에 default를 적어준 것입니다.
만약 위 두 경우도 모두 처리해줬다면 default를 적어주지 않아도 에러가 발생하지 않습니다.
ransportation 변수에 지금 Int와 Bool이 associated value로 들어가 있는데 다른 값을 할당하는 게 가능할까요???
Swift는 Type Safety를 지원하는 언어잖아요?? 궁금해졌습니다.
taxi case는 String만 airplane case는 Float와 String이니까 안될 거라고 생각하면 안 됩니다.
왜냐면 결국 이 변수의 타입은 Transportation 이기 때문입니다.
Associated value의 타입이 다르다고 변수에 다른 case가 할당이 불가능한 게 아닙니다.
마지막으로 아까 다섯, 여섯 번째 case에서 사용하던 문법에 대해서 알아보겠습니다!
Enumeration Case Pattern
Enumeration Case Pattern은 switch, for-in, if 등에서 사용됩니다.
Associated value를 상수 또는 변수에 매칭 시켜서 로컬 스코프에서 자유롭게 사용할 수 있도록 해줍니다.
예제를 보도록 하겠습니다.
switch문에서 사용할 때는 비교적 이해하기 쉽습니다.
let이나 var 키워드를 적어주고 원하는 변수 이름을 작성하면 됩니다. 그럼 저장된 associated value가 변수에 할당되고 case 안에서 사용할 수 있게 됩니다.
let으로 하면 상수이기 때문에 수정이 불가능하고 var로 하면 수정이 가능합니다.
만약 associated value가 여러 개이고 모두 한 번에 let 또는 var로만 설정하고 싶다면 case 바로 뒤에서 let, var를 적어서 한 번에 할당할 수도 있습니다.
변수명은 내가 원하는 대로 아무렇게나 지어도 괜찮습니다. 꼭 enum을 선언할 때 사용했던 이름으로 하지 않아도 됩니다.
그럼 이번에는 if문과 사용하는 방법을 보겠습니다.
핵심은 case 키워드입니다.
if case 뭔가 낯선 키워드 조합입니다.
case를 사용함으로써 Enum Pattern Matching을 사용한다는 것을 알려줍니다.
첫 번째 if문은 연관값을 바인딩시키지 않을 때 사용하는 방법입니다.
error 변수가 batteryLevelLow case이고 연관값인 level의 값이 10일 때 if문이 실행됩니다.
두 번째 if문은 두 연관값 중에 description만 상수로 바인딩시킨 후에 사용하는 방법입니다.
그럼 if문 안에서 des라는 상수를 사용할 수 있습니다.
세 번째, 네 번째 if문은 두 개 이상의 연관값을 한 번에 상수로 바인딩시키는 것을 보여줍니다.
마지막으로 for문에서 사용하는 방법을 알아보도록 하겠습니다.
Transportations 배열이 있습니다. 이 배열은 열거형을 모아놓은 배열이죠.
for case를 사용하여 배열을 반복시키면 모든 element를 반복하는 게 아니라 if문과 비슷하게 조건에 맞는 element만 반복하는 것을 확인할 수 있습니다.
첫 번째 for문은 bus case 중에서 num은 상수에 바인딩시키고 redBus인 것만 반복을 하게 됩니다.
두 번째 for문은 Line이 1인 subway case를 반복하게 되고 그중에서 isExpress 인지 아닌지를 if문으로 분기하여서 표시하도록 합니다.
만약에 다른 조건을 주고 싶다면 마지막에 where 절을 추가시켜서 조건을 추가시킬 수 있습니다.
마지막 for문에서 where절을 추가하여 바인딩 시킨 num이 "12가"로 시작하는 element만 반복하게 됩니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Struct & Class (0) 2021.10.20 Swift - Enumeration CaseIterable (0) 2021.10.18 Swift - Enumeration (열거형) (0) 2021.10.15 Swift - KeyValuePairs (0) 2021.10.14 Swift - Set (0) 2021.10.14