[Swift iOS] Associated Types에 대해 알아보자

JB
3 min readNov 26, 2021

--

  • 프로토콜을 정의할때 하나 또는 그 이상의 Associated Type이 있으면 유용
  • Associated Type는 프로토콜의 placeholder 이름을 제공
  • 프로토콜이 채택되기 전까지 Associated Typeㅣ 타임은 정해지지 않음
  • Associated Type 키워드로 Associated Type를 정의

다음은 Container 라는 프로토콜에 Item 라는 Associated Type을 정의한 예제입니다.

Container 프로토콜을 컨펌하면 아래 세가지는 필수로 구현을 하여야 하는데

  • append(_:) 메소드를 통해 새로운 아이템을 Container 에 appendable(넣을수있다)
  • count 프로퍼티를 통해 items의 갯수를 카운트 할 수 있음
  • subscript 를 통해 컨테이너의 각각 아이템을 인덱스로 검색할 수 있음

이 프로토콜은 ContainerItem이 어떻게 저장되거나 어떤 타입이 되어야하는지 명시하지 않았습니다. 단지 상기에 명시된 세가지의 구현만 필요합니다. 이 세가지만 충족하는 타입들은 이 외에 새로운 기능을 추가할 수 있습니다.

Container 프로토콜을 컨펌하는 모든 타입들은 저장되는 값의 타입을 명시하여야합니다. 자세히는, Container에 저장되는 모든 타입들은 일치하여야하고 subscript 를 통해 반환되는 타입들에 대해서도 일치해야합니다.

Container 프로토콜은 Container 가 어떤 요소들을 가질것인지 알아야합니다. 특히 append(_:) 메소드를 통해 어떠한 값이 전달될지,컨테이너의 타입과 같은 타입인지, 그리고 subscript 로 반환될 타입과 같은 타입인지도요.

이를 위해서 Container 프로토콜은 associatedtype Item 이라 명시되어있는 Item 을 통해 associated Type을 선언하여 해결합니다.

아레예제는 Container 를 컨펌하는IntStack 이라는 구조체의 예시입니다.

IntStack

  • Container 프로토콜의 준수사항을 모두 지킴 (3가지의 implementations)
  • Associated TypeItemtypealias Item = Int 로 타입 선언
  • typealias Item = Int 로 선언 시 자동으로 구현해주어야하는 3가지 implementation의 타입이 Int 로 변경

또한 Generic타입으로 Container를 컨펌 가능

마지막으로 Associated Type 에 제약조건을 줄 수 도 있는데

associatedTypeItemEquatable 프로토콜을 준수한다면, 모든 Item

들은 Equatable 을 준수하여야만 합니다.

--

--

JB
JB

Written by JB

iOS engineer @kakaobank

No responses yet