Swift Attributes: @unknown

Doldamul·2022년 8월 22일
0

개념

@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는 라이브러리에 정의된 열거형의 처리 구문을 항상 최신으로 유지할 수 있는 좋은 방법이다.

참고자료

profile
덕질은 삶의 활력소다. 내가 애플을 좋아하는 이유. 재밌거덩

0개의 댓글