스위프트에서 switch 구조는 확장된 패턴 매칭을 지원합니다: 특정 case에 조건을 추가하기 위해 where를 사용할 수 있습니다. 이를 통해 복잡한 비즈니스 논리와 필터링을 구현할 수 있습니다.
예:
enum Person { case student(score: Int) case teacher(specialty: String) } let people = [Person.student(score: 95), Person.teacher(specialty: "Math"), Person.student(score: 65)] for person in people { switch person { case .student(let score) where score > 90: print("우수한 성적자: \(score)") case .teacher(let specialty): print("과목 교사: \(specialty)") default: print("기타 경우") } }
where를 사용하면 가독성이 향상되고 코드 중복을 피할 수 있지만, 너무 복잡한 조건은 유지 보수를 악화시킬 수 있으며, 연관 값이 있는 패턴 매칭은 case의 순서를 명확히 제어해야 합니다.
질문: "switch 내에서 where와 함께 패턴 매칭을 할 때 각 case에서 고유한 이름의 변수를 호출해야 합니까?"
답변: 아니오, 하지만 혼란을 피하기 위해 권장됩니다. 다른 case에서 동일한 변수 이름을 사용하면 해당 case에 국한된 컨텍스트가 형성되지만, 동일한 이름은 가독성 및 코드 유지 보수에 방해가 될 수 있습니다.
예:
switch value { case .status(let code) where code == 200: print("확인됨") case .status(let code) where code == 404: print("찾을 수 없음")
이야기 1
은행 애플리케이션에서 여러 개의 where 조건이 포함된 상태 분석 섹션이 있었습니다. break를 놓치고 case 순서가 잘못되어 특정 경우가 처리되지 않아 사용자가 작업에 대한 전체 상태를 볼 수 없는 상황이 발생했습니다. 버그는 현장 테스트에서만 발견되었습니다.
이야기 2
인증 시스템에서 개발자가 서로 다른 case에서 동일한 변수 이름을 사용하여 혼란과 버그가 발생했습니다: 두 번째 경우에서 다른 case에서 정의된 변수를 사용하려고 했습니다. 빌드는 작동했지만 특정 시나리오에서 잘못되었습니다.
이야기 3
where와 함께 복잡한 패턴 매칭을 할 때 default가 연관된 enum의 일부 조합을 처리하지 못한다는 점을 고려하지 않아 애플리케이션이 패턴 매칭 실패 오류로 종료되었습니다. 문제는 향후 새로운 데이터 유형을 통합할 때만 발견되었습니다.