제네릭 where 절
- 타입 제약을 사용하는 경우 제네릭 함수, 서브 스크립트, 타입과 연관된 타입에 대한 요구사항을 정의할 수 있다.
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
}
- 제네릭 where절은 확장을 통해 추가 가능하다.
extension Stack where Element : Equatable {
func isTop(_ item : Element) -> Bool {
guard let topItem = items.late else {
return false
}
return topItem == item
}
}
- 상황별 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
}
}
- 제네릭 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
}