func someFunction<T : SomeClass, U : SomeProtocol>(someT : T, someU : U) {
//function body goes here
}
//위의 함수는 2개의 타입 파라미터를 가진다.
//첫 타입 파라미터 T는 someClass의 하윜늘래스여야 한다.
//둘째 타입 파라미터 T는 someProtocol을 준수해야 하는 타입 제약이 있다.
protocol someProtocol {
associatedtype Item
var a : Int {get}
var b : Int {get}
}
//해당 프로토콜은 2개의 읽기 전용 변수와 Item이라는 타입의 사용을 요구사항으로 갖는다.
struct ItemFriends : someProtocol {
var a: Int = 10
var b: Int = 12
typealias Item = String
func sum(a : Item, b : Item) -> Item {
return a + b
}
}
//다음의 구조체는 프로토콜을 상속하며 구현해야하는 타입에 대한 별칭을 지정해주어야 한다.
let a = ItemFriends()
print(a.sum(a: "Hi", b: "Kyungyun"))
//다음과 같이 타입 별칭으로서 String을 대신하는 경우 이상없이 함수 호출이 가능하다.
2.확장을 통한 연관된 타입지정이 가능하다. 프로토콜 준수성 추가와 마찬가지로 이를 위해서 기존 타입의 확장이 가능하며 여기엔 연관된 타입이 있는 프로토콜을 포함한다.
3. 연관된 타입에 대한 타입제약 또한 가능하다.
protocol Container {
associatedtype Item : Equatable
mutating func append(_ item : Item)
var count : Int {get}
subscript(i : Int) -> Item {get}
}
//다음에서 보듯 연관된 타입에 대한 타입을 지정하여 제약을 줄 수 있다.