21-2. 타입 제한(Type constraint)과 연관된 타입(Associated type)

🌈 devleeky16498·2022년 4월 22일
0

타입 제한

  1. 가끔 제네릭 함수와 제네릭 타입으로 사용될 타입에 대한 타입제약을 강제해야 할 경우가 있다. 타입 제약은 타입 파라미터가 특정 클래스를 상속하거나 프로토콜 구성을 준수해야 함을 지정하는 것이다.
func someFunction<T : SomeClass, U : SomeProtocol>(someT : T, someU : U) {
	//function body goes here
}
//위의 함수는 2개의 타입 파라미터를 가진다.
//첫 타입 파라미터 T는 someClass의 하윜늘래스여야 한다.
//둘째 타입 파라미터 T는 someProtocol을 준수해야 하는 타입 제약이 있다.

연관된 타입

  1. 연관된 타입은 프로토콜 선언 간 이를 준수하는 인스턴스에 요구사항으로서 사용할 타입을 명시해주는 것이다. 다음의 예시는 연관된 타입의 단순한 예이다.
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}
}
//다음에서 보듯 연관된 타입에 대한 타입을 지정하여 제약을 줄 수 있다.
profile
Welcome to Growing iOS developer's Blog! Enjoy!🔥

0개의 댓글