본문 바로가기
iOS

Swift: @retroactive

by Dev Arthur 2025. 5. 31.

@retroactive

해당 문법은 Swift6에 등장한 개념이다.

 

영어 그대로 해석해 보면,

소급

 

한글도 한 번 더 해석해 보면,

과거에도 영향을 미치게 하는 것

 

보통 법 관련해서 소급이라는 말을 자주 들어볼 수 있다.

예를 들어,

6월에 월 10만원씩 주는 법이 제정되었고, 해당 법이 1월부터 소급 적용된다고 하자.

그러면 1월부터 5월까지에 해당하는 50만원도 받을 수 있다는 뜻이다.

 

그런데, Swift에서 갑자기 왜 이런 문법이 등장한 걸까?

@retroactive 관련 Swift의 문서를 살펴보면

extension으로 다른 모듈에서 선언된 타입을 확장하면서,
해당 타입을 다른 모듈에서 선언된 프로토콜을 통해 확장하는 경우

 

= 즉, 확장하려는 타입과 적용하려는 프로토콜, 모두 외부 모듈에서 선언된 경우

 

위 경우에 소급 준수에 대한 경고가 발생하는데...

소급 준수는 또 뭔데...?

 

소급 준수란?

타입과 프로토콜, 둘 중 하나 이상 외부 모듈인 상황에서
내부 모듈에서 타입에 프로토콜을 준수하도록 하는 것

 

아래 예시들은 전부 소급 준수라고 볼 수 있다.

소급 준수는 한 곳에서만 extension으로 타입을 확장하면

해당 타입을 사용하던 곳, 어디든 전역적으로 확장해서 사용할 수 있기 때문에 소급 준수라고 한다.

 

하지만, 이러한 소급 준수는 잠재적 위험성도 존재한다.

외부 모듈의 경우, 통제권이 없어서 추후에 어떻게 변할지 모르기 때문에,

소급 준수가 충돌할 수도 있다는 것.

그나마, 타입 혹은 프로토콜 중 하나가 내부 모듈이라면 대처할 수 있지만

둘 다 통제권이 없는 외부 모듈이라면, 대처하기 곤란해진다.

그래서 둘 다 외부 모듈인 경우에 다음과 경고를 띄우게 된다.

해당 모듈의 타입 제작자가 추후, 해당 타입에 해당 프로토콜을 준수하도록 했을 때,
올바르게 동작하지 않을 수 있다.

 

즉, 추후에 중복 소급 준수가 발생할 수 있다는 것에 대한 경고를 말해준다.

 

이때 소급 준수하려는 프로토콜 앞에 @retroactive를 붙이면,

경고가 사라지게 된다.

 

오! 이러면 다 해결되는 건가?라고 생각할 수 있는데,,,

사실 오류를 뜨지 않도록 해주는 것일 뿐이다.

 

그리고 추가적으로,

잠재적인 문제에 대해 인식했고 책임지겠다는 명시적인 선언이 된다.

반응형

'iOS' 카테고리의 다른 글

SwiftUI: @ViewBuilder  (0) 2025.04.16
UIKit: Frame과 Bounds 3  (0) 2025.01.13
UIKit: Frame과 Bounds 2  (0) 2025.01.10
UIKit: Frame과 Bounds 1  (0) 2025.01.05
Xcode: 영역  (0) 2025.01.01