
Opaque Type
코드 사용자는 프로토콜 타입에서 제공하는 인터페이스만 사용 가능(Boxed Protocol Type과 동일)
but, 컴파일 타임에 컴파일러가 실제 타입을 알고 있다. → 코드 최적화 가능(예: 인라이닝)
프로토콜 타입 앞에 some을 붙여 사용
Opaque Type VS Boxed Protocol Type
Boxed Protocol Type : 메서드 구현 내부에서 다양한 타입 반환 가능
Opaque Type : 메서드 구현 내부에서 단 하나의 타입만 반환 가능 →컴파일러가 타입 추론 가능
예시) 
위 코드에 2개의 getAnimal 메서드가 있다.
Boxed Protocol Type은 반환 타입이 any Animal.
Opaque Type은 반환 타입이 some Animal.
코드적인 차이점을 보면, Boxed Protocol Type은 구현부에서 Dog() 또는 Cat()과 같이 여러 타입을 리턴할 수 있다. Opaque Type은 Cat() 한가지 타입만 반환하고 있다.

Opaque Type에서 여러 타입을 반환하려고 하면 오류가 발생한다.

컴파일러가 타입 추론이 불가능한 경우

animal.makeSound()는 인라이닝이 불가능하다. 커파일러가 Cat의 makeSound()로 대체해야 할지 Dog의 makeSound()로 대체해야 할지 모름.
