본문 바로가기

iOS/Swift

Swift5+) @unknown(Unfrozen Enumertaion)

 

 

 

안녕하세요 :) 소들입니다

뭐 글 쓸 때마다 오랜만이네요 뭐.. 1달 정도 됐나? 하하

구독자 100명 넘은 기념(^^)으로 글 좀 써보려고 합니다

글 쓰는 게 부담 되어서 글을 잘 안 썼었는데,

짧은 글이라도 다시 차근차근 써보려고 시도 하는 글

 

님들 @unknown 요렇게 생긴 것에 대해 본 적 있음?

Swift5에서 등장한 문법이라 꽤 알 수도 있을 거 같은데

이거에 대해 다뤄볼 것임

 

먼저 enum에 대해 모르시면

enum1편, enum2편 부터 보고 오시고!!!

그럼 공부해보도록 합시다 :D

모든 포스팅은 편의 말투로 합니다~!!

 

 

 

 

1. 기존 enum은 말이야..

 

먼저 예시를 보기 위해 열거형을 하나 만들어 보겠음

 

 

enum Gender {
    case male
    case female
    case transgender
}
 
func printGender(genderGender) {
    switch gender {
    case .male:
        print("🙋‍♂️")
    case .female:
        print("🙋‍♀️")
    case .transgender:
        print("🔁")
    }
}
 

 

 

만약 위처럼 Gender라는 열거형이 있을 경우,

switch 구문으로 사용할 때 해당 case에 대해서 모두 정의를 해주면

아무런 문제가 되지 않음

 

여기까지 당연하게 써왔던 거잖음??

근데 자 이제 세계가 다양한 성별을 이해해주기 시작하면서

Gender가 더 다양해지고 뭐 찾아봐도 잘 모르겠지만

캐나다에선 two-spirit이라는 정신적으로 여자/남자를 모두 가진

뭐 그런 성도 있대??

 

쨌든 그들도 존중을 위해서 해당 성을 우리는 Gender의 열거형에 추가했음

이렇게 계속적으로 case를 추가할 수 있는 열거형을 Nonfrozen Enumeration이라고 한다고 함

 

 

enum Gender {
    case male
    case female
    case transgender
    case two_spirit
}
 
func printGender(genderGender) {
    switch gender {         //Switch must be exhaustive
    case .male:
        print("🙋‍♂️")
    case .female:
        print("🙋‍♀️")
    case .transgender:
        print("🔁")
    }
}
 

 

 

이렇게 two-spirit이란 case를 열거형에 추가 했더니 switch 구문에서 에러남

에이 님아 뭐 이런 당연한 걸 글로 쓰고 있으셈? 싶잖음ㅎㅎ; 일단 들어보셈

 

switch 구문에서 모든 case에 대해 다루지 않았으니,

two_spirit에 대해서도 정의해줘!! 하고 에러가 나는 것임

 

열거형의 기본이지만 이 에러를 해결하는 데는 두 가지 방법이 있음

two_spirit에 대해 추가로 정의 해주거나 (모든 열거형에 대해 정의)

default를 구현해주든가

 

먼저, 제일 간단한 방법은 해당 case에 대해 추가로 정의를 하는 것임

 

 

enum Gender {
    case male
    case female
    case transgender
    case two_spirit
}
 
func printGender(genderGender) {
    switch gender {        
    case .male:
        print("🙋‍♂️")
    case .female:
        print("🙋‍♀️")
    case .transgender:
        print("🔁")
    case .two_spirit:
        print("🙋‍♂️🙋‍♀️")
    }
}
 

 

 

위처럼!!! 이렇게 해서 다시 모든 case에 대해 정의가 된 경우,

물론 에러는 사라짐

 

근데 세상에 이럴수가 또 새로운 성이 등장해버린 것임

남성/여성을 이분법으로 구분하는 기준에서 벗어난 사람을 non-binary라고 한다 함

이게 열거형 공부인지;;; gender 공부인지;;

 

따라서 위처럼 모든 case에 대해 정의해줄 경우,

 새로운 case가 추가 될 때마다 이 열거형을 쓰는 곳에선 매번 빨간 error가 뜸...

이 error들을 해결하기 전까진 빌드 fail ᄏᄏᄏᄏᄏᄏᄏᄏ 🎉🎉🎉🎉 **..

 

이라는 .. 문제가 있다 

 

 

걍 default 추가해주면 되는 거 아님?

라고 할 수 있음 뭐 세상에서 젤 간단한 방법이긴 혀

근데 이 방법은 언제 쓴다?

따로 정의할 필요가 없는 case들이 있어서 default로 빠져도 상관 없는 경우에나 쓸만하다!!

 

만약

모든 case에 대한 처리가 필요할 경우,

혹은 새로 추가된 case에 대해 개별 처리가 필요한 경우

default를 쓰는 게 사실 그닥 좋진 않음..

 

왜냑호?  default가 구현되어 있으면

"새로운 case가 추가된 경우" 해당 case에 대해 새로 처리를 해줘야 하는데,

 아무런 에러 혹은 warning조차 뜨지 않거든... 🤯

 

그럼,, 내가 프로젝트 내에서 해당 열거형을 사용하는 switch 구문을 모두 일일이 찾아서

새로 추가된 case에 대한 처리를 추가해줘야 하나,,?

 

라는 .. 문제가 있다

 

 

 

 

2.  미래를 준비하기 위한 @unknown

 

위의 문제들을 해결하기 위해 등장한 것으로,

제목은 거창한 미래를 대비한 @unknown

 

일단 왜 미래를 대비한 건지는 마지막에 알아보도록 하고,

@unknwon을 쓰는 방법은 default 앞에 붙여주는 것이 일반적이나,

모든 케이스를 담을 수 있는 case _ 앞에도 쓸 수 있음

 

 

enum Gender {
    case male
    case female
    case transgender
    case two_spirit
    case non_binary
}
 
func printGender(genderGender) {
    switch gender {        
    case .male:
        print("🙋‍♂️")
    case .female:
        print("🙋‍♀️")
    case .transgender:
        print("🔁")
    case .two_spirit:
        print("🙋‍♂️🙋‍♀️")
    @unknown default :
        print("👽")
    }
}
 

 

 

default로 보자면 이렇게!!

default 앞에 @unknown을 붙여주면,

만약 정의되지 않는 case(non_binary)가 있을 경우,

default가 있음에도 다음과 같이 switch 옆에 warning⚠️이가 뜬답니당

 

 

 

 

오..호..?..호호호?????????

 

정리하자면,

@unknown을 쓸 경우, 모든 case에 대해 처리를 해주지 않으면 

default가 구현되어 있어도, warning이 뜨기 때문에 인지할 수 있음

 

왜 미래를 대비 어쩌고 했냐면,

내가 사용하는 라이브러리의 새 버전에서 새로운 case가 나왔을 때 생기는 문제에 대비

할 수 있는 것임

근데 이제 빨간 error가 아닌 warning을 곁들인,, 🌷

 

 

뭐 위와 같이 "모든 케이스"에 대해 다룰 땐 분명 엄청난 장점이 있는 것 같음!!

근데 만약 정말 쓸데없는 case에 대해선 default로 구현하고 싶을 경우,,

@unknown을 사용하면 모든 case에 대해 정의하지 않았다는 까다로운 조건 때문에

모든 case에 대해 정의하지 전까지 저 warning은 사라지지 않는다고 한다.. never...

 

 

@unknown,,

이것은 warning 제조기인가,, 미래를 위한 준비인가,,

모든 case에 대해 처리를 해주고 싶을 때만 사용하는 것이 어떤지...

 

 

 

 

 

.

.

.

-끗-

그렇다고 한다..

뭔가 이번글,, 설명이 개떡같아서 별로 맘에 들지 않는다.......!!!!!!

쨌든 모든 case에 대해 처리를 해줘야 하는 경우엔 확실히 메리트가 있는듯??

잘못된 내용이나 오타 궁금증 피드백 모두 달게 받음~~

 



Calendar
«   2024/11   »
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
최근 댓글
Visits
Today
Yesterday