@unknown
특성은 확장 가능한(non-frozen) 열거형을 사용하는 switch
문의 default
case에 사용하는 특성이다.
switch 열거형 {
...
@unknown default:
...
}
@unknown default
구문은 라이브러리에 정의된 열거형을 사용한switch
문이 완전함을 보장함과 동시에, 라이브러리가 업데이트되면서 열거형에 새 case가 추가되었을 경우 알려주는 역할을 한다. 일반default
구문과 다르게,@unknown default
에 매칭되는 case가 있을 경우 경고를 띄우기 때문이다.
이해가 되지 않는다면 간단히 예제를 살펴보자. 열거형을 정의해보았다.
enum Direction {
case up
case down
}
var direction = Direction.up
일반적으로, 열거형은 암시적으로 @frozen
특성을 가진 것으로 처리된다. 그래서 우리는 switch
문에서 default
문을 생략할 수 있다.
// frozen 열거형을 사용하는 경우
switch direction {
case .up:
...
case .down:
...
// default: // 열거형의 모든 case를 처리했으므로 default문은 생략한다.
}
하지만 애플 라이브러리에 정의된 열거형들은 frozen 특성이 적용되지 않은 열거형이 대부분이다. 추후에 라이브러리 개발자가 열거형에 새로운 case를 추가할 가능성이 있기 때문이다. 이러한 경우에는 default
문을 생략할 수 없다.
// non-frozen 열거형을 사용하는 경우 - 1
switch direction {
case .up:
...
case .down:
...
default: // non-frozen 열거형은 제3의 case를 전달할 가능성을 지니고 있다.
...
}
@unknown
특성이 붙은 default
문은 미래에 추가될 열거형 case들만을 처리한다는 의미를 갖는다. 따라서 switch
문은 열거형에 현재 존재하는 모든 case들이 default
문 바깥에서 매칭되도록 처리해야 한다. 다만, default
문 바깥에서 매칭된 뒤 fallthrough
구문을 통해 default
문이 실행되는 경우에는 경고가 발생하지 않는다.
// non-frozen 열거형을 사용하는 경우 - 2
switch dir {
case .up:
...
case .down:
...
@unknown default:
... // default와 매칭되는 case가 있을 경우 처리되지 않은 새 case가 존재한다는 경고를 띄운다.
}
함수가 Deprecated되면 그 함수가 사용된 구문에 경고를 띄우는 것처럼, @unknown default
는 라이브러리에 정의된 열거형의 처리 구문을 항상 최신으로 유지할 수 있는 좋은 방법이다.