티스토리 뷰

반응형

 

 

 

Opaque Types — The Swift Programming Language (Swift 5.7)

Opaque Types A function or method with an opaque return type hides its return value’s type information. Instead of providing a concrete type as the function’s return type, the return value is described in terms of the protocols it supports. Hiding type

docs.swift.org

swift 5.1버전부터 지원을 하고 있는 문법 중, Opaque Types, 불투명 타입 문법이 있습니다. 오늘은 불투명 타입이 쓰일 수 있는 케이스를 클래스와 프로토콜을 사용하여 돌아보도록 하겠습니다. 

 

 


Opaque types을 어디에서 사용 중일까?

SwiftUI로 개발을 해보신 분이라면 위 코드를 안보신 분이 없으실 겁니다. 여기에도 Opaque Type이 사용되었습니다. body 내부에서는 View 프로토콜을 채택한 다양한 UI 구조체를 사용할 수 있습니다. 하지만 외부에서는 구체적인 타입을 세세하게 공개할 필요가 없죠. Opaque type을 사용했기에 가능했습니다.

 

 


protocol을 채택한 객체를 생성 후, Opaque type 방식으로 반환방법

ConfigurableCell이라는 protocol이 있습니다. associatedtype으로 Model 이라는 제네릭타입이 있고, configure로 Model를 설정할 수 있게 되어있습니다. 

typealias로 ConfigurableCell을 채택할 경우 준수해야 하는 Model타입을 User 타입으로 바꾸어서 사용해보겠습니다.

 

 

ConfigurableCell 프로토콜을 채택한 두개의 클래스입니다. associatedtype은 User타입으로 정의를했고, configure(_:) 메서드로 Model (User 타입으로 정의) 타입을 받아서 설정할 수 있습니다. 이번에는 이 클래스 객체들을 생성해서 반환하는 메서드를 만들어볼게요.

 

 

각각 StudentCell, StaffCell 객체를 반환하는 메서드인데, 아쉽게도 각 클래스 객체들이 준수하고  있는 프로토콜 타입으로는 반환을 할 수가 없습니다. 그럼 각각 StudentCell, StaffCell로 명시를해서 반환해야만 하는걸까요? 하지만 우리는 Opaque Type을 사용할 수가 있습니다.

 

 

Opaque type을 사용한 모습입니다. 'some ConfigurableCell' 타입을 반환타입으로 사용하니, 두개의 메서드 모두 컴파일 에러가 해결되었습니다. 이렇게 Opaque Type을 사용하면 본인들의 명확한 타입은 숨기고 각 객체들이 준수하는 프토토콜 타입만으로 반환을 할 수가 있습니다.

반환한 Opaque Type은 세부 타입으로 타입 캐스팅을 해서 사용할 수도 있지만, 타입 캐스팅 없이 Opaque type 자체에서 제공하는 메서드나 변수를 접근하여 사용할 수도 있습니다. 이를 확인하기 위해 ConfigurableCell 프로토콜에 추가적인 메서드 규약을 추가해보겠습니다.

 

 


메서드에서 반환한 Opaque Type 사용해보기

ConfigurableCell 프로토콜에 임의로 identifier() 메서드를 추가해봤습니다. 자동적으로 ConfigurableCell 프로토콜을 채택한 StudentCell, StaffCell은 identifier() 메서드를 구현해야하기에 추가로 구현한 모습입니다. 각각의 객체 모두 name을 identifier() 메서드를 통해 반환하고 있습니다.

 

 

다시 Opaque type을 반환타입으로 지정했던 메서드로 돌아왔습니다. Opaque type을 반환하는 메서드에 identifier() 메서드를 실행하면 각각의 객체에 대한 name 이 정상적으로 출력되는 것을 볼 수 있습니다.

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함