- 프로토콜을 정의할때 하나 또는 그 이상의 Associated Type이 있으면 유용
- Associated Type는 프로토콜의 placeholder 이름을 제공
- 프로토콜이 채택되기 전까지 Associated Typeㅣ 타임은 정해지지 않음
- Associated Type 키워드로 Associated Type를 정의
다음은 Container
라는 프로토콜에 Item
라는 Associated Type을 정의한 예제입니다.
Container
프로토콜을 컨펌하면 아래 세가지는 필수로 구현을 하여야 하는데
append(_:)
메소드를 통해 새로운 아이템을Container
에 appendable(넣을수있다)count
프로퍼티를 통해 items의 갯수를 카운트 할 수 있음subscript
를 통해 컨테이너의 각각 아이템을 인덱스로 검색할 수 있음
이 프로토콜은 Container
에 Item
이 어떻게 저장되거나 어떤 타입이 되어야하는지 명시하지 않았습니다. 단지 상기에 명시된 세가지의 구현만 필요합니다. 이 세가지만 충족하는 타입들은 이 외에 새로운 기능을 추가할 수 있습니다.
Container
프로토콜을 컨펌하는 모든 타입들은 저장되는 값의 타입을 명시하여야합니다. 자세히는, Container
에 저장되는 모든 타입들은 일치하여야하고 subscript
를 통해 반환되는 타입들에 대해서도 일치해야합니다.
Container
프로토콜은 Container
가 어떤 요소들을 가질것인지 알아야합니다. 특히 append(_:)
메소드를 통해 어떠한 값이 전달될지,컨테이너의 타입과 같은 타입인지, 그리고 subscript
로 반환될 타입과 같은 타입인지도요.
이를 위해서 Container
프로토콜은 associatedtype Item
이라 명시되어있는 Item
을 통해 associated Type을 선언하여 해결합니다.
아레예제는 Container
를 컨펌하는IntStack
이라는 구조체의 예시입니다.
IntStack
은
Container
프로토콜의 준수사항을 모두 지킴 (3가지의 implementations)Associated Type
인Item
을typealias Item = Int
로 타입 선언typealias Item = Int
로 선언 시 자동으로 구현해주어야하는 3가지 implementation의 타입이Int
로 변경
또한 Generic
타입으로 Container를 컨펌 가능
마지막으로 Associated Type
에 제약조건을 줄 수 도 있는데
associatedType
인 Item
이 Equatable
프로토콜을 준수한다면, 모든 Item
들은 Equatable
을 준수하여야만 합니다.