develop

AssociatedType 본문

iOS

AssociatedType

pikachu987 2021. 1. 8. 11:53
반응형

연관 타입이라고 한다.

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