@retroactive은 Swift6에서 도입된 어트리뷰트입니다.
@retroactive 채택은 Swift의 기능 중 하나로, 기존에 정의된 클래스나 구조체에 나중에 프로토콜을 추가하는 방식입니다. 이를 통해, 이미 존재하는 타입들에 새로운 프로토콜을 추가할수 있다고 합니다.
이 코드는 앱에서 스와이프로 뒤로가기 코드입니다.
extension UINavigationController: @retroactive UIBarPositioningDelegate {}
extension UINavigationController: @retroactive UINavigationBarDelegate, @retroactive UIGestureRecognizerDelegate {
open override func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = self
}
public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return viewControllers.count > 1
}
}
extension UINavigationController: @retroactive UIBarPositioningDelegate {}swift
UINavigationController: 이 클래스를 확장하여 두 개의 프로토콜인 UIGestureRecognizerDelegate와 UINavigationBarDelegate를 추가합니다.
그리고 UIBarPositioningDelegate는 추가적으로 채택됩니다.
위의 코드에서는 UINavigationController가 이미 정의된 타입이지만, UIBarPositioningDelegate 프로토콜을 나중에 추가하는 방식입니다. 이렇게 하면 UINavigationController가 UIBarPositioningDelegate의 프토토콜을 충족할 수 있습니다.
• 기본 데이터 타입에서 동일한 프로토콜의 중복 준수로 인해 예기치 않은 버그 발생.
• 특히 라이브러리 모듈에서 선언된 경우, 클라이언트 코드에서의 예측 불가성 증가.
이렇게 되기에 @retroactive를 사용을 하여 미연에 위와같은 문제를 방지할 수 있습니다.