티스토리 뷰

Tech/Swift

Phantom Type 팬텀타입

Ellie Kim 2019. 5. 7. 21:04

raywenderlich YOUTUBE영상을 보다가 신기한 게 있어서 정리하려 합니다.

(처음 들어본 팬텀 타입 ,,하하)

 

 

여기 있는 loopup 딕셔너리는 주와 수도가 연결되어 있습니다.

하지만 직관적으로 눈에 들어오진 않습니다.

이것을 개선하기 위해선 typealias를 사용할 수 있습니다. 

String타입 대신에 State와 Capital로 변경하면 지금 보단 직관적입니다.

 

 

조금 더 직관적으로 보이죠 ,, 😦

이렇게 하면 loopup딕셔너리는 주와 수도로 이뤄진 딕셔너리로 이전보다 파악하기 쉬워집니다.

 

 

자 그럼 주와 수도를 출력해보는 test함수를 만들고 출력해봅시다.

이렇게 test 함수를 호출했는데 출력은 The capital of Juneau is Alaska라고 출력됩니다.

(주노의 주는 알래스카입니다.)

 

엥 이게 왜,,,

 

무엇이 이상한지 눈치챘나요 . . 

 

실수로 주와 수도를 바꿔서 적었습니다.

원래는 The capital of Alaska is Juneau라고 출력되어야겠죠.

(알래스카의 주는 주노입니다.)

 

이 문제를 해결하기 위해 우리는 State와 Capital타입을 만들어 줄 수 있습니다.

 

 

이렇게 해주면 컴파일 에러가 발생합니다. 

typealias를 지우면 에러가 사라지고 또 에러가 발생합니다.

cannot convert value of type 블라 블라 주와 수도를 잘못 적었으니 타입이 맞지 않죠.

 

 

printStateAndCapital을 호출하는 부분을 변경해주면 발생했던 컴파일 에러가 사라집니다.

 

 

하지만 State와 Capital는 중복되는 코드가 굉장히 많습니다.

비슷한 형태를 가졌지만 또 이것들을 합치긴 싫고 구분해주고 싶죠.

그래서 PhantomType이 나왔습니다.

 

 

중복 코드를 개선하기 위해 Capital을 지우고 State를 Named로 이름을 변경해주고 제네릭으로 만들어줍니다.

 

 

 

우리는 정적으로 디스패치할 수 있는 타입을 두 개 생성해줍니다.

enum으로 CapitalTag와 StateTag를 생성했습니다. 

이렇게 두 가지 타입을 만들 수 있습니다.

 

 

전체적으로 팬텀 타입을 사용한 코드의 형태는 이렇습니다. 

 

팬텀타입을 사용해 코드 중복을 제거하고 두 개의 별개의 타입을 사용해 혼동되지 않도록 만들어 줍니다.

또한 팬텀 타입을 사용하면 올바른 위치에 올바르게 사용할 수 있도록 도와줍니다.

 

참고

https://www.youtube.com/watch?v=T-GgQU5sxbc&t=211s

'Tech > Swift' 카테고리의 다른 글

정수형 숫자 타입 맞추기  (0) 2019.07.22
스위프트 배열에서 중복을 제거하는 방법  (0) 2019.05.19
Swift ARC에 대해서(3)  (0) 2019.04.20
Swift ARC에 대해서(2)  (0) 2019.04.19
Swift ARC에 대해서(1)  (0) 2019.04.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함