1. Frozen Enum과 Non-frozen Enum
enum Menu {
case chiken
case pizza
}
위와 같은 열거형이 있다고 가정해 봅시다.
열거형에 case를 계속해서 추가할 수 있는 열거형을 `Non-frozen Enumeration`(얼지 않은 열거형)라고 합니다.
일반적으로 가장 많이 사용하는 유형이죠.
@frozen enum Menu {
case chiken
case pizza
}
그렇다면 반대로 enum 선언 시 `@frozen` 키워드를 넣어 열거형을 정의하면 `Frozen Enumeration`(얼은 열거형)이 되어 더 이상 case가 추가되지 않을 것을 암시함과 더불어 컴파일 성능이 향상된다고 합니다.
case가 더 이상 추가 되지 않을 것이 확실하다면 `@frozen`을 명시해 주는 게 좋겠죠?
2. @unknown default와 default의 차이
let menu: Menu = .pizza
switch menu {
case .chiken:
print("오늘의 메뉴는 chiken")
case .pizza:
print("오늘의 메뉴는 pizza")
}
1번 예제의 enum에서 예제를 확장하여 switch문을 작성하였습니다.
swift의 switch문에서는 모든 case에 대한 처리가 되지 않으면 `Switch must be exhaustive` 에러가 발생하기 때문에 `@unknown default` 혹은 `default`를 명시하여 새로운 case에 대한 대비를 합니다.
2-1. @unknown default
`@unknown default`는 미래에 추가될 새로운 case에 대비하여 작성하는 코드입니다.
현재 `Menu` enum에는 chiken, pizza 두 가지 case가 존재하지만 새로운 메뉴가 추가될 수 있는 상황이 존재하니, 추가적인 case가 생겼을 때 warning 메시지가 발생하여 switch문 수정이 필요하다는 사실을 개발자가 인지할 수 있게 됩니다.
`@unknown default`로 미래에 추가될 case에 대해 미리 처리를 해두면 새로운 case가 추가되었을 때 컴파일 error가 아닌 warning이 뜨게 됩니다.
enum에 case가 추가되는 경우는 이렇게 사용자 정의 enum도 있겠지만 sdk에서 제공하는 enum에서도 추가 case가 나올 가능성은 다분하니 미리 정의해 두면 유지보수와 추가 개발에 도움이 될 것입니다.
2-2. default
default는 새로운 case가 추가되어도 default로 빠져서 처리되기 때문에 별도의 warning이나 error는 발생하지 않습니다.
이 말은 곧 새로운 case에 대한 처리가 어렵게 되는 것이죠.
2-3. @unknown default와 default의 차이
- `@unknown default` 미래에 추가될 case를 대비한다.
- case가 추가됐을 때 warning 메시지를 통해 새로운 case가 추가되었음을 개발자가 인지한다.
- `default` 명시된 case 이외의 모든 처리를 한다.
- case가 새롭게 추가되어도 별도의 warning이나 error가 없다.
3. @unknown 사용 팁
한 가지 신경쓰이는 점이라면 미래에 추가될 case를 위해 `@unknown default`를 명시해 두었는데 실제로는 아직 case가 추가되지 않았기 때문에 해당 구문은 실행될 일이 없어 불필요한 warning 메시지 `Default will never be executed`가 나타난다.
`@unknown case _`로 설정해 두면 위에서 발생했던 `Default will never be executed` 메시지는 사라지고, 새로운 case가 추가되었을 때 warning 메시지를 받을 수 있다.