[Programming Language]/[Swift]

[Swift] ~= 연산자 : 범위 확인 연산자, 패턴 매치 연산자

Semincolon 2024. 10. 24. 23:52

[머릿말]

프로그래머스에서 문제를 풀고 다른 사람의 풀이를 보던 중 새로운 연산자를 보게 되었다. 파이썬에서 바다 코끼리 연산자(:=)를 처음 보았을 때 느꼈던 기분이었다😀


1. ~=(_:_:) 연산자  [범위 확인 연산자]

공식 문서에서의 내용은 다음과 같다.

"값이 범위에 포함되는지를 나타내는 Boolean 타입 값을 반환한다."

 

범위에 값이 포함되어 있는지, 즉 contains 메서드와 같은 기능을 하는 연산자라고 보면 된다.

 

사용 방법은 아래 예제와 같다.

print(1...10 ~= 5)  // true
print(1...10 ~= 11) // false

if 1..<10 ~= 10 {   // false
    print("범위에 포함됩니다.")
} else {
    print("범위에 포함되지 않습니다.")
}

valuepattern에 포함되면 true, 그렇지 않으면 false가 반환된다.

 

 

2. ~=(_:_:) 연산자  [패턴 매치 연산자]

이 연산자는 패턴 매치(Pattern Match)의 기능도 수행한다. 공식 문서에서의 내용은 다음과 같다.

"두 매개변수가 같은 값으로 매치되는지를 나타내는 Boolean 타입 값을 반환한다."

 

이 연산자는 switch ~ case 구문에서 내부적으로 사용되어 왔다고 한다.

위 예제 코드에서 weekday 변수의 값은 3이므로 case 3: 부분에서 ~= 연산자가 내부적으로 호출되고 있다는 것이다.

 

2-1. 연산자 오버라이딩

이 연산자를 오버라이딩(Overriding)하여 switch ~ case 구문에서 사용할 수도 있다.

func ~=(caseValue: Int, conditionValue: String) -> Bool {
    return String(caseValue) == conditionValue
}


let a: String = "12345"

switch a {
case 12345:
    print("일치")  // 일치
default:
    print("불일치")
}

위 예제에서 caseValuecase 부분에 해당하는 값이고, conditionValueswitch 조건 변수에 해당하는 값이다. 두 변수명은 아무렇게나 지어도 상관없다.

 

String 타입으로 선언된 변수 a를 정수 12345와 비교하기 위해 연산자를 오버라이딩하였다. caseValue에 정수 12345가, conditionValue에 변수 a의 값 "12345"가 전달되어 String(12345) == "12345" 문장이 실행되어 true가 반환된다.

 


끝!