어제 UIDocumentViewController 샘플을 직접 만들어 보았다.
WWDC23에서 제공된 정보가 불충분하긴 한 탓에 undo/redo 기능을 완벽히 구현하지 못했는데, 궁금증이 생겨서 UIDocument.ChangeKind
정의를 따라가보았다.
@MainActor open class UIDocument : NSObject, NSFilePresenter, ProgressReporting {
...
}
extension UIDocument {
...
public enum ChangeKind : Int, @unchecked Sendable {
case done = 0
case undone = 1
case redone = 2
case cleared = 3
}
...
}
@unchecked Sendable
프로토콜을 채택하고 있다.
Sendable 프로토콜을 정확히 준수하지 않았을 때 컴파일러에서 warning 메세지에 포함됐던 경험이 있다. 당시에는 'Sendable을 잘못사용하고 있구나' 정도로만 이해하고 넘어갔었는데 이번에야 말로 정확한 의미를 찾아보게 됐다.
@unchecked
는 컴파일러가 안정성 검증을 생략하게 한다. 주로 성능 최적화, 코드 호환성, 내부 동작을 제어할 필요가 있을 때, 개발자가 명시적으로 타입의 스레드 안정성을 관리하겠다는 의도를 표현한다. 즉 정합성을 체크하지 않는 옵션인 것이다.
현재는 Sendable외에 다른 프로토콜에 사용되는 케이스는 발견되지 않아서, @unchecked Sendable
처럼 숙어처럼 사용되고 있다.