Swift에서 튜플에 대한 패턴 매칭은 값을 편리하게 비교하고 언팩하는 기능을 제공합니다. switch 문에서는 패턴 내에서 튜플을 바로 분리할 수 있습니다:
let point = (x: 0, y: 2) switch point { case (0, 0): print("원점") case (0, let y): print("x = 0, y = \(y)") case let (x, y) where x == y: print("x는 y와 같습니다.") default: print("다른 점입니다.") }
중요 사항:
switch-case에서
(String, Int)타입의 튜플을 다른 타입의 case 패턴인case (let a, let b):와 비교할 수 있나요?
종종 할 수 있다고 답하지만, 중요한 점은 패턴 내 변수의 타입이 튜플의 타입에 엄격히 일치해야 한다는 것입니다.
let pair = ("abc", 5) switch pair { case (let text, let number): print("문자열: \(text), 숫자: \(number)") // 괜찮음 case (let x, let y) where x == y: print("오류") // 오류: '==' 이항 연산자는 'String'과 'Int' 타입의 피연산자에 적용할 수 없습니다. default: break }
타입이 일치하지 않으면 컴파일러가 컴파일 단계에서 오류를 발생시킵니다.
이야기
한 프로젝트에서 서버 응답을 튜플로 분석하기 위해 switch-case를 사용하려 했으나 nil 가능성을 고려하지 않았습니다. 이로 인해 어떤 case도 일치하지 않아 default가 작동하게 되었고, 다른 논리가 예상됐습니다.
이야기
타입 불일치: 튜플 처리기 함수가 (Int, String)을 받았으나 (String, Int)로 언팩하려고 했습니다. 결과는 컴파일 단계에서 크래시가 발생하고 이유를 찾는 데 소요된 시간입니다.
이야기
부정적인 값을 고려하지 않고 결과 튜플 언팩을 위해 guard를 사용했으나, 처리는 양의 정수만 위해서만 예정되어 있었습니다. 결국 유효한 케이스의 일부가 무시되어 비즈니스 로직에서 문제가 발생했습니다.