오늘은 where절에 대해서 알아보자.
where
절은 특정 패턴과 결합하여 조건을 추가하는 역할을 한다.
where 절의 용도는 크게 두가지이다.
func printPoint(_ point: (Int, Int)) {
switch point {
case (0,0):
print("(0,0) is at the origin")
case (-2...2, -2...2) where point.0 != 1:
print("(\(point.0), \(point.1)) is near the origin")
default:
print("The piont is at (\(point.0), \(point.1))")
}
}
where
절은 위와 같이 표현 패턴과 결합할 수 있다.
case (-2...2, -2...2) where point.0 != 1:
에 대해서 봐보자.
case (-2...2, -2...2)
는 익숙하다.
입력받은 point
가 모두 -2에서 2사이에 있는 case를 뜻한다.
where point.0 != 1
은 뭘까?!
입력받은 point의 첫번째 요소가 1이 아닌 경우를 뜻한다.
그렇다면 아래의 코드로 제대로 동작하는지 확인해보자.
let origin = (0, 0)
printPoint(origin)
let point = (1, 2)
printPoint(point)
let lastPoint = (2, 1)
printPoint(lastPoint)
// 결과
(0,0) is at the origin
The piont is at (1, 2)
(2, 1) is near the origin
(2, 1)을 point로 넘겨주자 우리가 원하는대로 출력되었다.
where
절은 타입에 대해 제약을 추가할 수 있다.
protocol ProtocolName where Self: UIViewController {
...
}
이런식으로 프로토콜 익스텐션에 where
절을 사용하면 익스텐션이 특정 프로토콜을 준수하는 타입에만 적용될 수 있도록 제약을 줄 수 있다.
익스텐션이 적용된 프로토콜을 준수하는 타입 중 where
절 뒤에 제시되는 프로토콜도 준수하는 타입만 익스텐션이 적용되도록 제약을 줄 수 있다.
위의 코드는 ProtocolName
은 UIViewController
에 준수하는 타입에만 사용하고 싶다는 얘기이다.
아래와 같은 코드로 String extension
을 구현했고, 위의 질문을 받았다.
extension String{
var isNotValidate: Bool {
let validateAddressPrefix = ["https://", "http://"]
for validate in validateAddressPrefix {
if self.hasPrefix(validate) {
return true
}
}
return false
}
}
위의 코드는 문자열이 https://
혹은 http://
로 시작하는지 알아보는 코드이다.
그렇다면 해당 코드를 where
절을 이용해서 코드의 뎁스를 줄여보자.
extension String {
var isNotValidate: Bool {
let validateAddressPrefix = ["https://", "http://"]
for validate in validateAddressPrefix where self.hasPrefix(validate) {
return true
}
return false
}
}
for validate in validateAddressPrefix where self.hasPrefix(validate)
구문으로 코드의 뎁스를 줄였다.
where절에 대해서 알아봤다.
위의 예제 말고도 엄청 다양하게 where 절을 사용할 수 있을거 같다.
위의 예제들은 엄청 베이직한 부분인거 같고, 앞으로 where절을 이용할때마다 더 추가해보도록 하겠다!
그럼 이만👋