develop
AssociatedType 본문
반응형
연관 타입이라고 한다.
protocol ExampleProtocol {
var value: Int { get }
}
위와 같은 프로토콜이 있다고 가정해 보자
코드에서 이 프로토콜을 공통적으로 사용을 하는데 value가 String이 필요한 화면이 있다.
그래서 하나 더 만들면
protocol ExampleProtocol2 {
var value: String { get }
}
그러다가 value가 Int와 String 둘다 받을 수 있게 되었다.
그러면 value를 어디서든 사용할수 있게 타입을 AnyObject로 해보자
protocol ExampleProtocol {
var value: AnyObject { get }
}
class Example: ExampleProtocol {
var value: AnyObject {
return 10 as AnyObject
}
}
class Example2: ExampleProtocol {
var value: AnyObject {
return "Hi" as AnyObject
}
}
struct Example3: ExampleProtocol {
var value: AnyObject {
return (10, "Hi") as AnyObject
}
}
이쁘지가 않고 타입캐스팅을 해줘야 한다.
이럴때 associatedType를 사용해보면
protocol ExampleProtocol {
associatedtype ExampleType
var value: ExampleType { get }
}
class Example1: ExampleProtocol {
typealias ExampleType = Int
var value: ExampleType {
return 10
}
}
class Example2: ExampleProtocol {
var value: String {
return "Hi"
}
}
struct Example3: ExampleProtocol {
var item = (10, "HI")
var value: (Int, String) {
return self.item
}
}
타입이 명확하게 표현된다.
associatedtype에 여러가지 타입을 지정해줄수 있다.
class Test {
}
protocol ExampleProtocol {
associatedtype ExampleType: Test
var value: ExampleType { get }
}
클래스를 만들어서 지정해 보았다.
class Test {
}
class Test1: Test {
}
class Test2: Test {
}
protocol ExampleProtocol {
associatedtype ExampleType: Test
var value: ExampleType { get }
}
class Example1: ExampleProtocol {
var value: Test1 {
return Test1()
}
}
class Example2: ExampleProtocol {
var value: Test2 {
return Test2()
}
}
이렇게 사용 가능하다.
associatedtype에 Equatable을 써보자
protocol ExampleProtocol {
associatedtype ExampleType: Equatable
var value: ExampleType { get }
}
class Example1: ExampleProtocol {
var value: Int {
return 10
}
}
class Example2: ExampleProtocol {
var value: String {
return "Hi"
}
}
Equatable을 만족하는 타입을 사용하면 이런식으로 할수 있다.
Test에도 Equatable을 상속받아보자
class Test: Equatable {
var value = 0
static func == (lhs: Test, rhs: Test) -> Bool {
return lhs.value == rhs.value
}
}
class Test1: Test {
}
class Test2: Test {
}
protocol ExampleProtocol {
associatedtype ExampleType: Equatable
var value: ExampleType { get }
}
class Example1: ExampleProtocol {
var value: Test1 {
return Test1()
}
}
class Example2: ExampleProtocol {
var value: Test2 {
return Test2()
}
}
코드가 AnyObject를 받는 거보다 명확하다.
반응형
'iOS' 카테고리의 다른 글
Blocking, Non-blocking (0) | 2021.01.10 |
---|---|
Semaphore (0) | 2021.01.09 |
Convenience init (0) | 2021.01.07 |
LifeCycle (0) | 2021.01.06 |
ARC(Automatic Reference Counting) (0) | 2021.01.05 |
Comments