본문 바로가기

Swift/꼬꼬무

Protocol Composition (프로토콜 혼합)

 

프로토콜 혼합을 사용해서 여러 프로토콜을 단일 요구사항으로 결합할 수 있습니다.

동시에 여러개의 요구사항을 준수하는 타입을 요구할때 유용하게 사용할 수 있습니다.

프로토콜 혼합은 & 로 결합해서 쓸 수 있습니다.

예를들어서 SomeProtocol & AnotherProtocol 형식

프로토콜 혼합은 프로토콜 리스트 외에도 필요한 수퍼 클래스를 지정하는 데 사용할 수 있는 하나의 클래스 유형이 포함될 수 있습니다.

 

클린 아키텍처를 구성할때 CoordinatorDependencies 들을 묶어서 사용할때 많이 사용했는데 모르는 사이 프로토콜 혼합을 자주 사용하고 있었습니다.

 

 

다음은 Named 와 Aged 라는 두 프로토콜을 함수 파라미터에 단일 프로토콜 요구사항으로 결합한 예제

 

Named 프로토콜은 name이라는 gettable String타입 프로퍼티를 단일 요구사항으로 가지고 있고, Aged는 age라는 gettable Int타입 단일 요구사항을 가지고 있습니다.

두 프로토콜을 Person 이라는 구조체에서 채택 합니다.

wishHappyBirthday 메서드는 파라미터 타입은 Named 와 Aged 프로토콜이 결합한 타입입니다.

두 프로토콜을 준수하기만 하면 어떤 타입이라도 상관 없습니다.

Person 구조체는 Named, Aged 프로토콜을 모두 준수하기 때문에 birthdayPerson라는 Person 인스턴스는 생일 축하 메시지를 출력할 수 있습니다.!

 

 

다음은 클래스와 프로토콜을 혼합하는 에제로 Location 클래스와 Named 프로토콜을 결합하는 예제입니다.

 

beginConcert(in:) 함수의 파라미터는 Location 의 서브 클래스와 Named 프로토콜을 준수하는 모든 타입 입니다.

City 클래스는 Location 수퍼클래스를 상속받고, Named 프로토콜도 준수하기 때문에 여기에 해당됩니다.

이전 예제에서 생성한 birthdayPerson 인스턴스는 Named 프로토콜은 준수하지만 Location의 서브 클래스가 아니기 때문에 유효하지 않습니다.