일모도원(日暮途遠) 개발자

[스위프트] switch문에서 @unknown default 본문

프로그래밍 언어/스위프트

[스위프트] switch문에서 @unknown default

달님개발자 2022. 9. 13. 23:48

스위프트에서 enum을 swtich문을 쓸때는 모든 케이스를 다 적어주는걸 권장하는거 같다.

일부 빠진 케이스가 있으면 아래처럼 "Switch must be exhaustive" 에러가 난다.

exhaustive[ ɪɡˈzɔːstɪv] 철저( 徹底)한, 완벽( 完璧)한의 뜻이다.


그래서 보통 이렇게 enum의 모든  케이스를 다 적어주던지

아님 이렇게 안적어준 부분을 default로 처리한다.

 


근데 분명히 모든 케이스들들 다 적어줬는데도 이런 요상한 경고가 뜨기 시작한다. 사용자가 만든 enum

"Switch covers known cases, but 'AVAudioSession.RecordPermission' may have additional unknown values, possibly added in future versions"

Switch문이 현재 이미 알려진 enum의 케이스들은 다 처리하는데, AVAudioSession.RecordPermission란 놈은 미래에 또 다른 케이스를 추가할수 있다는 워닝이다. 

 

새로운 케이스가 추가될수 있으면 NON-FROZEN enum이라고 하고, 새로운 케이스가 추가되지 않는건 FROZEN enum이라고 한다.

 

현재는 C로 작성한 enum이 아니면 이 워닝은 안뜬다고 한다.(현재는 애플에서 만드는 라이브러리에만 적용되지만 나중에는 확장될수도 있다)

 

 

사실 enum에서 만든 Case들을 Switch문으로 처리할때는 default를 쓰는건 좋은 코딩방법이 아니다.

Switch문에서 모든 케이스를 일일히 적어서, 같이 처리할건 같이 처리하는게 좋다. 

 

왜냐하면 enum에 다른 Case값이 추가되면 기존에 만들어둔 Switch문이 에러가 나기 때문에(새로 추가된 Case는 처리를 하지 않았으므로) 새로 추가된 값에 대해서 대응을 하기 쉽기 때문이다.

 

일부Case들을 default로 처리하면 새로 추가된 case가 아무런 경고도 없이 default로 처리되고 개발자는 새로 추가된 enum값을 처리해야 하는걸 깜박하고 넘어갈수 있기 때문이다.

 

하지만 enum에 다른 Case값이 추가되었다고 기존 코드가 다 에러가나면 이것도 전부다 수정하는게 귀찮은 경우도 있다. 지금 당장 수정하는게 급한게 아닌 경우등.

 

그래서 Swift 5에서 추가된것이 @unknown 이라는 키워드이다. 지금 작성한 Switch문은 모든 케이스를 다 처리했지만, enum에서 또다른 케이스를 추가할수 있으므로 enum에 새로운 case가 추가되면 경고를 주는거다. (에러가 아닌 경고다)

 

 

 

(@unknown default를 추가하라고 권장한다)

 

아래처럼 사용한다. 

switch recordingSession.recordPermission {
case .undetermined:
    completion(true)
case .denied:
    completion(true)
case .granted:
    completion(true)
@unknown default:
    fatalError()
}

참고로 @unknown default가 있어도 모든 case가 명시적으로 처리 되지 않으면 이렇게 워닝이 뜬다.

(default가 없는 경우에는 에러가 뜬다)

 

 

참고

https://www.avanderlee.com/swift/unknown-default-enums-in-swift/

 

@unknown default usage with enums in Swift

Why and how to use @unknown default in Swift 5 and up. Learn why it does not always show up and why it's helping your project to be future proof.

www.avanderlee.com