@retroactive

Jehyeon Lee·2024년 9월 21일
0

@retroactive?

@retroactive은 Swift6에서 도입된 어트리뷰트입니다.
@retroactive 채택은 Swift의 기능 중 하나로, 기존에 정의된 클래스나 구조체에 나중에 프로토콜을 추가하는 방식입니다. 이를 통해, 이미 존재하는 타입들에 새로운 프로토콜을 추가할수 있다고 합니다.

프로토콜의 추가

  • Swift에서는 타입이 정의된 이후에 프로토콜을 추가할 수 있습니다. 이를 통해 기존 타입이 새로운 기능을 갖도록 할 수 있습니다.
  • @retroactive를 사용하면, 해당 타입의 구현을 수정하지 않고도 프로토콜을 채택할 수 있습니다.

예시

이 코드는 앱에서 스와이프로 뒤로가기 코드입니다.

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의 프토토콜을 충족할 수 있습니다.

왜 사용할까?

  • 유연성: 기존 클래스의 기능을 확장할 수 있어 코드의 유연성을 높입니다. 예를 들어, 라이브러리나 SDK의 기본 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.
  • 호환성 유지: 기존 코드와의 호환성을 유지하면서 새로운 기능을 제공할 수 있습니다.
  • @retroactive를 통해 코드의 명확성과 최적화를 지원합니다.
  • 런타임 에러 방지: 만약 Test 타입에서 Identifiable 프로토콜을 사용 하고 있었는데 그 타입이 swift버전이 업데이트 되면서 Test타입에 Identifiable를 기본적으로 내포하게 된다면 밑에 문제가 생깁니다.

    • 기본 데이터 타입에서 동일한 프로토콜의 중복 준수로 인해 예기치 않은 버그 발생.
    • 특히 라이브러리 모듈에서 선언된 경우, 클라이언트 코드에서의 예측 불가성 증가.

이렇게 되기에 @retroactive를 사용을 하여 미연에 위와같은 문제를 방지할 수 있습니다.

참고

https://green1229.tistory.com/507

profile
공부한거 느낌대로 써내려갑니당

0개의 댓글

관련 채용 정보