21-3. 제네릭 where 절, where절이 있는 연관된 타입

🌈 devleeky16498·2022년 4월 22일
0

제네릭 where 절

  1. 타입 제약을 사용하는 경우 제네릭 함수, 서브 스크립트, 타입과 연관된 타입에 대한 요구사항을 정의할 수 있다.
func allItemsMatch<C1 : Container, C2 : Container>(_ someContainer : C1, _ anotherContainer : C2) -> Bool where C1.Item == C2.Item, C1.Item : Equatable {
    if someContainer.count != anotherContainer.count {
    	return false
    }
    
    for i in 0..<someContainer.count {
    	if someContainer[i] != anotherContainer[i] {
        	return false
        }
    }
    return true
}
//다음의 함수는 someContainer와 anotherContainer라는 2개의 인자를 갖는다.
//그리고 이들은 각각 C1타입과 C2타입이다.
//이 타입에 대해서 조건이 몇가지 붙게 되는데, 이는 다음과 같다.
//1. C1은 Container 프로토콜을 준수해야 한다.
//2. C2는 Container프로토콜을 준수해야 한다.
//3. C1.item == C2.item으로 작성하였듯, 두 아이템은 동일해야 한다.
//4. C1.item : Equatable이므로 이는 Equtable을 준수해야 한다.
  1. 제네릭 where절은 확장을 통해 추가 가능하다.
extension Stack where Element : Equatable {
	func isTop(_ item : Element) -> Bool {
    	guard let topItem = items.late else {
        	return false
        }
      	return topItem == item
    }
}
  //다음과 같이 확장에 대해서 제네릭의 조건을 추가해줄 수 있다.
  1. 상황별 where절을 각각 확장을 통해 추가 가능하다.
extension Container where Item == Int {
	func average() -> Double {
    	var sum = 0.0
        for index in 0 ..<count {
        	sum += Double(self[index])
        }
        return sum / Double(count)
    }
}

extension Container where Item : Equatable {
	func endsWith(_ item : Item) -> Bool {
    	return count >= 1 && self[count-1] == item
    }
}
//다음과 같이 확장을 통해서 서로 다른 조건절을 추가해주는 것이 가능하다.
  1. 제네릭 where 절이 있는 연관된 타입을 추가해 줄 수 있다.
protocol Container {
	associatedtype Item
    mutating func append(_ item : Item)
    var count : Int {get}
    subscript(i : Int) -> Item {get}
    associatedtype Iterator : IteratorProtocol where Iterator.Element == Item
    func makeIterator() -> Iterator
}
profile
Welcome to Growing iOS developer's Blog! Enjoy!🔥

0개의 댓글