관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] @unknown default, @frozen enum 개념 본문

iOS 기본 (swift)

[iOS - swift] @unknown default, @frozen enum 개념

jake-kim 2022. 3. 22. 22:35

@unknown이란?

  • enum타입을 접근하는 switch-case문에서 사용되는 키워드
  • 추가적인 case가 생겼을 때, 기존에 switch-case문에서 해당 case를 선언하지 않고 @unknown default로 선언해 놓으면 사용하는 쪽에서 warning 메시지를 받아볼 수 있어 인지할 수 있게끔 하는 키워드

@unknown default 사용한 경우 warning 메시지 확인 가능

예시)

  • switch문에서 case에 대한 모든 조건을 선언하면 컴파일 에러와 워닝이 발생하지 않고 정상적인 케이스
enum Color {
  case blue(name: String, alpha: CGFloat)
  case green(name: String, alpha: CGFloat)
}

let color = Color.blue(name: "blue", alpha: 0.5)
switch color {
case let .blue(name, alpha):
  print(name, alpha)
case let .green(name, alpha):
  print(name, alpha)
}
  • 만약 red 케이스가 추가되었을 때, switch문에서 red 케이스 처리를 해주지 않으면 컴파일 에러가 발생
enum Color {
  case blue(name: String, alpha: CGFloat)
  case green(name: String, alpha: CGFloat)
  case red
}

  • 사용하는 쪽에서 default로 처리하면 컴파일 에러가 발생하지 않는 상태지만, warning메시지를 받아볼 수 없어 사용하는쪽에서 새로 생겨난 case를 인지하지 못하는 상황
    • @unknown default를 사용하면 warning 메시지 확인 가능

@frozen 이란?

  • frozen: 얼은 상태 (enum 타입에서 case가 추가적으로 생겨나지 않을 것임을 명시)
    • 컴파일러는 더욱 효율적으로 컴파일
  • 예시) Objective-C에서의 enum들은 swift에서 frozen되지 않은 것으로 간주하기 때문에 아래와 같은 warning 메시지가 표출
    • Objective-C의 UIUserInterfaceSizeClass을 사용할 때 case에 모든 유형을 명시했지만 warning 메시지가 표출
    • 위에서 알아본 @unknown default를 명시해줘야 하는 상태

  • 아래처럼 명시적으로 @frozen을 써준다면, 컴파일러의 효율성 향상에 도움
@frozen enum Color {
  case blue(name: String, alpha: CGFloat)
  case green(name: String, alpha: CGFloat)
  case red
}

 

* 참고

https://jllnmercier.medium.com/swift-unknown-and-frozen-attributes-8d4eea52d5ac

https://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID602

https://docs.swift.org/swift-book/ReferenceManual/Attributes.html

Comments