본문 바로가기

[Swift 5.1] Opaque Result Types 그리고 some (SE-0244)

기술적인 이야기/애플 플랫폼 개발 2019. 10. 18.
반응형

이번 글은 아마도 Swift 5.1 업데이트 내역 중 제가 가장 이해하기 힘들었던 변화 같습니다. SE-0244 Opaque Result Types에서 소개된 불투명한 결과 타입(Opaque Result Types)을 위한 some이라는 키워드 도입에 관한 내용입니다.

말로 설명하기 어려우니 예제를 봅시다. 아래 코드는 어떤 컬렉션을 만족하는 인스턴스를 돌려주는 함수를 구현하고 있습니다.

func someList() -> Collection {
    return [1, 2, 3]
}

안타깝게도 위 코드는 아래와 같은 빌드 에러를 발생시킵니다.

Protocol 'Collection' can only be used as a generic constraint because it has Self or associated type requirements

뭔가 다양한 콜렉션 타입의 인스턴스를 리턴 하고 싶었는데 세상은 만만하지 않습니다. Swift는 정적 타이핑 언어이며 따라서 리턴하는 값도 컴파일러가 타입을 알 수 있어야 합니다. 하지만 Collection은 Generic이라 관련된 타입(Associated Type)을 명시하지 않으면 결국 그 타입 자체를 알 수 없는 것과 마찬가지입니다. 그래서 이런 코드는 컴파일을 할 수가 없습니다.

다만 위 함수를 이용해서 결과를 리턴받는 코드 측에서 타입을 명시했다면 컴파일이 가능할지도 모릅니다.

이런 명확하지 않은 타입을 리턴해야 하는 경우 some을 이용하면 목적대로 구현할 수 있습니다.

func someList() -> some Collection {
    return [1, 2, 3]
}

이런 식으로 우리는 특정 프로토콜을 만족하는 어떠한 인스턴스가 리턴될 것이다 라는 것을 컴파일러에게 알려줄 수 있게 됩니다. 바로 이 some의 능력이지요. 이렇게 some이 붙은 타입을 일부가 가려진 채로 사용되는 타입이라는 의미로 Opaque Result Type이라고 부릅니다.

위 예에서는 Collection이 예로 사용되었지만, 이 외에도 Equatable 등등 여러 프로토콜에서 활용이 가능할 것 같습니다. 거기다 SwiftUI에서 사용되는 코드들도 이 some을 적극적으로 활용하도록 디자인 되었습니다.

과연 제가 제대로 이해한 것인지 모르겠지만 일단 이 항목은 여기까지만 정리합니다. 프로포절의 내용은 엄청 기므로 제대로 알고 싶으시다면 꼭 읽어보시길 추천드립니다.

728x90
반응형

댓글