프로그래밍미들 iOS 개발자

Swift에서 튜플을 사용한 패턴 매칭은 어떻게 작동하며, 튜플 비교 시 고려해야 할 중요한 사항은 무엇입니까?

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

답변

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("다른 점입니다.") }

중요 사항:

  • 요소의 수와 순서는 튜플과 일치해야 합니다.
  • Possible binding 및 guard 표현식은 일반 변수와 같이 작동합니다.
  • Exhaustiveness check는 완전한 범위가 정의된 값의 튜플에 대해서만 가능합니다.

트릭 질문

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를 사용했으나, 처리는 양의 정수만 위해서만 예정되어 있었습니다. 결국 유효한 케이스의 일부가 무시되어 비즈니스 로직에서 문제가 발생했습니다.