Swift에서 where 절은 특정 패턴과 결합하여 조건을 추가하는 역할을 한다. 조건을 더 추가하고 싶을때, 특정 타입에 제한을 두고 싶을때 등 다양한 용도로 사용된다.

타입에 제약을 주는 것은 개발자가 제네릭 메서드, 첨자, 타입과 관련한 타입 매개변수의 요구사항을 정의할 수 있게 해준다. 관련 타입들의 요구사항 정의를 위해 개발자는 where절을 사용할 수 있다.

where절은 where 키워드를 사용하며, 그 뒤에 관련 타입에 대한 제약사항이나 충족해야 하는 관계 조건을 정의하면 된다. 블록의 타입, 메서드가 시작하는 중괄호 {} 전에 활용할 수 있다.

where 절의 활용

where절은 크게 두가지 용도로 사용된다.

즉 특정 패턴에 Bool 타입 조건을 지정하거나 어떤 타입의 특정 프로토콜 준수 조건을 추가하는 등의 기능이 있다.

for 문으로 순회하는데 있어서 순회하는 요소의 조건을 짝수로 한정해 출력한다. where 절은 프로토콜 타입의 제약 외로 특정 타입 값을 충족해야 하는 관계 조건을 제약사항으로 둘 수 있다.

let arr: [Int] = [1, 2, 3, 4, 5, 6, 7, 8]
// 값 바인딩, 와일드 카드 패턴
// i 요소가 2로 나웠을때 0일 경우(짝수)일 때만 블록 실행
for i in arr where i % 2 == 0 {
    print(i)
}

/*
2
4
6
8
*/

옵셔널 패턴과 결합

let arr: [Int?] = [1, 2, 3, 4, 5, 6, 7, 8]

// 옵셔널 패턴과 결합
for case let i? in arr where i % 2 == 0 {
    print(i)
}

/*
2
4
6
8
*/
let arrOfOptionalString: [String?] = ["서근", nil, "개발노트", "히", nil, nil]

for case let value? in arrOfOptionalString where value.count > 1 {
    print("String 타입을 찾는 중.... '\\(value)'")
}
/*
 String 타입을 찾는 중.... '서근'
 String 타입을 찾는 중.... '개발노트'
*/

타입 캐스팅 패턴과 결합

var point: (Int, Int) = (1, 2)

switch point {
case (0, 0):
    print("원점")
 //point 첫번째 값이 1과 다른 값인지 비교하여 값이 같지 않다면 출력
case (-2...2, -2...2) where point.0 != 1:
    print("(\\(point.0)), (\\(point.1))은 원점과 가깝다.")
default:
    print("포인트 : (\\(point.0), \\(point.1))")
}

//포인트 : (1, 2)