프로젝트를 진행하면서 프로토콜을 쓸 일이 종종 있었는데 이런 의문점이 들었다.
이 타입들은 내부 프로퍼티 용도나 이름도 동일한고 같은 목적의 메소드를 사용하는데 내부 프로퍼티 타입만 다르네...다른 건 이 프로퍼티 타입 뿐인데 얘네들을 하나의 프로토콜로 묶어서 쓸 수 없을까?🧐
구글링을 해봤더니 역시 똑똑한 Swift는 가능했다!!!푸하하
바로
을 사용하면!
일단 이 타입은 프로토콜에서 사용되는 타입이다.(당연함)
Protocol ConvertProtocol {
var key: String { get }
func seachValue() {}
}
위와 같은 프로토콜을 사용할 때, 어떤 타입에서는 key
를 String 타입으로 사용하지만, 어떤 타입에서는 Int 타입으로 사용하고 싶다면?
Associated Type
을 사용할 수 있다.protocol ConvertProtocol {
associatedtype MyType
var key: MyType { get }
}
위와 같이 Associated Type을 이용해서 프로토콜을 정의하면
struct A: ConvertProtocol {
var key: String {
return "a"
}
}
struct B: ConvertProtocol {
var key: Int {
return 1
}
}
이렇게 프로퍼티의 타입을 다르게 사용하는 것이 가능하다!
즉, 실제로 프로토콜이 적용될 때 타입이 결정되는 것이다.
마치 Generic과 비슷하군🤔
assciatedtype MyType: Equatable
위와 같이 제약을 준다면 MyType을 사용하는 프로퍼티는 Equatable을 준수하는 타입만을 채택할 수 있는 것이다.