where

이원희·2020년 12월 31일
0

 🐧 Swift

목록 보기
16/32
post-thumbnail

오늘은 where절에 대해서 알아보자.

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절 뒤에 제시되는 프로토콜도 준수하는 타입만 익스텐션이 적용되도록 제약을 줄 수 있다.

위의 코드는 ProtocolNameUIViewController에 준수하는 타입에만 사용하고 싶다는 얘기이다.


Q. 코드의 뎁스를 줄이는 팁🌟이 있습니다. swift의 where절을 한번 찾아보세요

아래와 같은 코드로 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절을 이용할때마다 더 추가해보도록 하겠다!
그럼 이만👋

0개의 댓글