where
where 절은 특정 패턴과 결합하여 조건을 추가하는 역할을 한다.
크게 두 가지 용도로 활용된다.
. (스위치문)
.
case let (x, y) where x == y: print("x == y") // where 절을 사용해 조건 추가
.
.
for case let number? in ABC where number > 2 {
print("Found a \(number)")
}
. (스위치문)
.
case let value where value is Int: print("value is Int")
.(스위치문)
.
case (-2, -2, -2....2) where point.0 != 1: print("(\(point.o), \(point.1))은 원점과 가깝습니다.")
프로토콜 익스텐션에 where절을 사용하면 이 익스텐션이 특정 프로토콜을 준수하는 타입에만 적용될 수 있도록 제약을 줄 수 있다.
즉, 익스텐션이 적용된 프로토콜을 준수하는 타입 중 where 절 뒤에 제시되는 프로토콜도 준수하는 타입만 익스텐션을 적용하게 하는 것이다.
.
.
extension Selfprintable where Self: FixedWidthInteger, Self: , SignedInteger { //FixedWidthInteger, SignedInteger도 준수하는 타입만 익스텐션 적용
.
.
.
}
제네릭 함수의 반환타입 뒤에 where절을 포함하면 타입 매개변수와 연관 타입에 요구사항을 추가할 수도 있다. 이러한 요구사항은 타입 매개변수가 특정 클래스를 상속 받았는지 또는 특정 프로토콜을 준수하는지를 표현 할 수 있다.
func prints<T, U>(first: T second: U) where T: CustomStringConvertible, U: CustomStringConvertible {
. //타입 매개변수 T와 U가 프로토콜을 준수하는 타입
.
}
protocol Container {
associatedtype ItemType where ItmeType: BinaryInteger //프로토콜 연관타입에 타입 제약을 줌
.
.
.
}