프로그래밍스위프트 개발자

스위프트에서 범위(pattern matching) 비교는 어떻게 작동하며 switch 구현 시 고려해야 할 특이점은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

스위프트에서 범위 매칭은 switch-case에서 값을 범위와 비교하는 데 자주 사용됩니다. 이를 위해 ..< (half-open range)와 ... (closed range) 연산자를 사용합니다:

let score = 76 switch score { case 0..<60: print("미흡") case 60..<80: print("양호") case 80...100: print("우수") default: print("잘못된 값") }

특징:

  • 범위는 증가하는 순서여야 합니다: 작은 수에서 큰 수로 (그렇지 않으면 범위가 비어 있습니다).
  • 매칭은 값이 범위 내에 있을 때 성공합니다.
  • 범위는 구조체이므로, 모든 Comparable 타입과 매칭하는 데 사용할 수 있습니다.

함정 질문

만약 switch에서 상한이 포함되지 않는 범위(예: 0..<5)를 사용하고 변수의 값이 5라면 어떻게 될까요?

종종 해당 case가 작동할 것이라고 대답하지만 이는 잘못된 답변입니다: ..< 연산자는 상한을 포함하지 않습니다. 예:

let value = 5 switch value { case 0..<5: print("0-4") case 5: print("다섯") default: print("기타") } // 출력: "다섯"

주제에 대한 무지로 인한 실제 오류 사례


이야기

개발자는 사용자의 점수를 범위에 따라 표현하기 위해 상한이 최대 값보다 높은 닫힌 범위를 사용하여 구현했습니다. 이로 인해 일부 값이 두 개의 구간에 모두 포함되어 로직이 올바르게 작동하지 않았습니다.


이야기

어플리케이션에서 범위를 사용한 switch-case가 있었고, 값 중 하나가 잘못된 연산자 사용(예: 0...10과 11...20 — 값 10.5가 어디에도 포함되지 않음)으로 인해 아무 범위에도 포함되지 않았습니다. 버그는 프로덕션에서만 발견되었습니다.


이야기

서비스 코드에서 날짜를 범위 매칭을 통해 비교했으나 half-open range를 잘못 사용하여 종료 날짜가 포함되지 않아 올바른 간격이 걸러져 마지막 유효 날짜의 예약이 불가능했습니다.