티스토리 뷰
안녕하세요 :) Zedd입니다.
오늘은...Associated Type!
Associated Type
Associated Type.....처음 들으면 이게 뭐지???싶죠. 관련된 타입?..이게 뭐야..
이 Associated Type은 프로토콜에서 사용된답니다.
프로토콜을 모르시는 분들은 꼭!! 알고오셔야해요 :)
자..프로토콜이 하나 있습니다.
protocol ZeddProtocol{
var name: String { get }
}
이제 이 ZeddProtocol을 채택하는 모든 타입은 반드시 name을 정의해주어야 하죠.
get만을 요구하니 어떠한 종류의 프로퍼티든 상관없이 이 요구조건을 만족할 수 있겠네요.
원한다면 set도 될 수 있구요!!!
암튼 잠깐 복습...
근데..만약 음..name이 물론 String이겠지만!!! 뭐 Int가 될 수 있다면?????
String말고 다른 타입이 될 수 있는 여지가 있다면!?!??!?!?!?!
이럴 때!!!!! 바로 Associated Type을 사용하면 됩니다.
protocol ZeddProtocol {
associatedtype MyType
var name: MyType { get }
}
바로 이렇게요!!
Associated Type은 원래 typealias였는데, Swift 2.2부터 Associated Type이란 키워드로 바뀌었습니다 :)
Associated Type이 뭡니까
Type!!!!!!네 바로 타입이에요. 그러니까 name은 MyType이라는 타입인거에요.
struct Zedd: ZeddProtocol{
var name: Int{
return 100
}
}
get만을 요구했으니..set이 있어도 되긴 하지만 일단 이렇게 해볼게요. ZeddProtocol을 채택했으니 ZeddProtocol이 요구하는 name을 정의해줘야할텐데..name은 분명 MyType이었지만, 여기서는 Int로 타입을 결정했네요.
이게 가능하냐?
가능하다는 것이죠
뭐때문에? Associated Type때문에 ㅇㅇ
struct Elsa: ZeddProtocol {
var name: String {
return "Elsa"
}
}
Elsa Struct에서는 name이 String을 리턴하게 하고싶다? Associated Type이니까 가능!!!
뭔지 조금은 감이 오시죠?
Associated Type에도 제약을 줄 수 있는데요,
protocol ZeddProtocol{
associatedtype MyType: Equatable
var name: MyType { get }
}
Equatable이 뭔지 모르신다면 <Equatable>글을 참고해주세요.
ㅇㅇ야 name이 무슨타입인진 모르겠는데 근데 Equatable을 준수하는 타입이어야해
라고 제약사항을 걸어주는 것이죠.
<Equatable>글에도 나오지만 Swift의 기본데이터타입은 Equatable을 만족시키지만..
class A{ }
제가 방금 만든 A라는 클래스는, 즉 A라는 타입은 Equatable을 준수하지 않죠.
그렇다면..?
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같은 역할을 한답니다 :) 타입의 견본을 주는거죠. 진짜 타입을 주는게 아니라요!! 사용할 실제 타입은 프로토콜이 적용될때가지 지정되지 않으니 유용하게 쓸 수 있습니다.
'iOS' 카테고리의 다른 글
iOS ) Gesture Recognizer - Long Press (0) | 2018.01.16 |
---|---|
iOS ) Custom Framework만들고 추가하는 법 (5) | 2018.01.13 |
iOS ) Auto Layout (15) | 2018.01.11 |
iOS ) LocalAuthentication사용시 issue 해결 (1) | 2018.01.10 |
iOS ) App에서 Web페이지를 여는 방법 정리 (13) | 2018.01.09 |
- swift delegate
- 제이슨 파싱
- SwiftUI
- github
- IOS
- swift array
- 스위프트
- ios 13
- swift 공부
- fastlane
- actor
- iOS delegate
- Git
- Swift
- 피아노
- np-complete
- 회고
- swift3
- UIBezierPath
- Combine
- swift sort
- WWDC
- 스위프트 문법
- swift tutorial
- WKWebView
- Xcode
- WidgetKit
- np-hard
- FLUTTER
- Accessibility
- Total
- Today
- Yesterday