티스토리 뷰

iOS

iOS ) Associated Type

Zedd0202 2018. 1. 12. 20:29
반응형

안녕하세요 :) Zedd입니다.

오늘은...Associated Type!



Associated Type



 Associated Type.....처음 들으면 이게 뭐지???싶죠. 관련된 타입?..이게 뭐야..

이  Associated Type은 프로토콜에서 사용된답니다. 

프로토콜을 모르시는 분들은 꼭!! 알고오셔야해요 :)


자..프로토콜이 하나 있습니다.



  1. protocol ZeddProtocol{

        var name: String { get }

       

    }


이제 이 ZeddProtocol을 채택하는 모든 타입은 반드시 name을 정의해주어야 하죠.

 get만을 요구하니 어떠한 종류의 프로퍼티든 상관없이 이 요구조건을 만족할 수 있겠네요.

원한다면 set도 될 수 있구요!!!

암튼 잠깐 복습...


근데..만약 음..name이 물론 String이겠지만!!! 뭐 Int가 될 수 있다면?????

String말고 다른 타입이 될 수 있는 여지가 있다면!?!??!?!?!?!

이럴 때!!!!! 바로 Associated Type을 사용하면 됩니다. 



  1. protocol ZeddProtocol {

        associatedtype MyType

        var name: MyType { get }


    }


바로 이렇게요!!

Associated Type은 원래 typealias였는데, Swift 2.2부터 Associated Type이란 키워드로 바뀌었습니다 :)

Associated Type이 뭡니까

Type!!!!!!네 바로 타입이에요. 그러니까 name은 MyType이라는 타입인거에요.


  1. struct Zedd: ZeddProtocol{

        var name: Int{

            return 100

        }

    }



get만을 요구했으니..set이 있어도 되긴 하지만 일단 이렇게 해볼게요. ZeddProtocol을 채택했으니 ZeddProtocol이 요구하는 name을 정의해줘야할텐데..name은 분명 MyType이었지만, 여기서는 Int로 타입을 결정했네요.

이게 가능하냐?

가능하다는 것이죠

뭐때문에? Associated Type때문에 ㅇㅇ


  1. struct Elsa: ZeddProtocol {

        var name: String {

            return "Elsa"

        }

    }


Elsa Struct에서는 name이 String을 리턴하게 하고싶다? Associated Type이니까 가능!!!

뭔지 조금은 감이 오시죠?


Associated Type에도 제약을 줄 수 있는데요,


  1. protocol ZeddProtocol{

        associatedtype MyType: Equatable

        var name: MyType { get }

    }



Equatable이 뭔지 모르신다면 <Equatable>글을 참고해주세요.

ㅇㅇ야 name이 무슨타입인진 모르겠는데 근데 Equatable을 준수하는 타입이어야해

라고 제약사항을 걸어주는 것이죠.

<Equatable>글에도 나오지만 Swift의 기본데이터타입은 Equatable을 만족시키지만..


  1. class A{ }


제가 방금 만든 A라는 클래스는, 즉 A라는 타입은 Equatable을 준수하지 않죠.

그렇다면..?


  1. struct Elsa: ZeddProtocol{


        var name: A{

            return A()

        }

    }


이렇게한다면...????????네..error를 내게 됩니다.

무슨 에러일까요. Type 'Elsa' does not conform to protocol 'ZeddProtocol'

ZeddProtocol의 Associated Type인 MyType은 Equatable을 준수하는 타입이어야하는데..그걸 준수하지 않았으니 이런 에러를 내게 됩니다. 


Associated Type이 프로토콜에서 나오는 것 같지만 사실, <Generic>에서 나오는 개념 중 하나랍니다. 

Associated Type은 <Generic> 서 Placeholder같은 역할을 한답니다 :) 타입의 견본을 주는거죠. 진짜 타입을 주는게 아니라요!! 사용할 실제 타입은 프로토콜이 적용될때가지 지정되지 않으니 유용하게 쓸 수 있습니다. 







반응형