본문 바로가기

프로그래밍/Swift

Opaque and Boxed Protocol Types

첫 번째, 목적.

두 가지 타입의 핵심은 타입을 숨기는 것이다. 우리가 보는 것은 public interface일 뿐, 그 내부 구조는 궁금하지 않다. 궁금하다면 함수의 Signature나 설계가 잘못되었는지 의심해야 한다.

 

두 번째, Opaque Type

공식 문서에서는 Opaque Type과 Generic을 비교한다.

An opaque type lets the function implementation pick the type for the value it returns in a way that’s abstracted away from the code that calls the function.

 

Generic은 호출부에서 타입을 지정하고, Opaque Type은 구현부에서 타입을 지정한다.

두 개는 완전히 다르지만, 추상 타입을 쓴다는 점에 둘을 비교하는 것이 탁월해 보인다.

(Opaque "Protocol" Type과 Generic이 같은 목적을 위해 사용된다는 것은 참고)

 

핵심은 "구현부"와 "지정"이다.

 

구현부에서 타입을 지정하기 때문에, 구현부가 변경될 가능성이 있다면 Opaque Type을 쓸 수 있다. 주로 독립된 모듈에서 사용되면 좋을 것 같다. 대표적으로 SwiftUI View Protocol의 var body: some View { get } 가 그렇다.

 

"지정"하기 때문에, 지정하지 못하는 경우 Opaque Type을 사용할 수 없다. 반환되는 타입이 구현부에서 지정되지 않는다면 Opaque Type이 아닌 다른 방법을 알아봐야 한다.

 

세 번째, Boxed Protocol Type

Opaque의 한계를 어느 정도 해소해 줄 수 있는 방법이다. "지정"하지 않기 위한 타입. 유연하지만 타입 추론을 해야 하기 때문에 비용이 들고, "지정"되지 않기 때문에 타입에 대한 연산을 할 수 없다.

 

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/opaquetypes/