스위프트에서 switch와 enum 구조는 강력한 패턴 매칭 능력과 엄격한 타입 안전성을 제공하여 다른 언어와의 차별성을 보여줍니다.
C, C++ 및 Objective-C에서 열거형은 단순한 정수 값의 집합으로 구성되며 switch 연산자는 일치하는 값을 비교합니다. 스위프트의 열거형(enum)은 훨씬 강력하여, 연관 값, 계산된 속성 및 메소드를 지원합니다. switch 연산자는 패턴 매칭, 불완전한 분기 방지 및 범위, 튜플, 옵셔널 등을 처리하는 기능을 갖추고 있습니다.
전통적인 언어에서 switch는 종종 모든 케이스를 포괄하지 않아 발생하는 오류, 타입 오류 및 enum의 케이스에 추가 데이터를 안전하게 저장할 수 없는 문제를 초래합니다. 이는 컴파일 타임이 아닌 실행 시 오류를 발생시킵니다.
스위프트에서 switch는 열거형이 @unknown default로 명시적으로 주석 처리되지 않는 한 모든 경우를 완전히 처리해야 합니다. 연관 값은 enum의 케이스에 추가 정보를 우아하게 저장할 수 있게 해줍니다. 예:
enum NetworkResult { case success(Int) case failure(String) } func handle(result: NetworkResult) { switch result { case .success(let code): print("성공 코드: \(code)") case .failure(let error): print("실패 오류: \(error)") } }
주요 특징:
enum에 대해 항상 switch에서 default를 작성해야 합니까?
아니요, 모든 열거형 케이스가 명시적으로 커버된다면 default는 필요하지 않습니다. 더구나, 필요 없이 default를 사용하는 것은 권장되지 않습니다 — 컴파일러가 enum의 새로운 케이스 추가 시 경고하지 않을 수 있습니다.
케이스 간 자동 전환을 위해 fallthrough를 사용할 수 있습니까?
예, fallthrough 키워드는 사용 가능하지만 신중하게 사용해야 합니다. 연관된 값을 전달하지 않으며, 그러한 전환은 실제 스위프트 사용에서 많이 일어나지 않습니다.
switch number { case 1: print("하나") fallthrough case 2: print("아니면 두 개") default: print("기타") }
스위프트의 enum이 연관된 값을 가지고 있다면 rawValue로 비교할 수 있습니까?
아니요. 연관된 값이 없는 열거형만이 명시적으로 정의된 rawValue로 초기화되고 비교될 수 있습니다.
개발자가 enum NetworkResult에 대해 switch에서 default-case를 추가하여 새로운 케이스를 추가할 때 처리 로직이 업데이트되지 않아 프로그램이 "조용히" 잘못 작동했습니다.
장점: 케이스 추가 시 컴파일러 경고 없음.
단점: 오류가 애플리케이션 실행 시 나타나며, 로직이 자동으로 업데이트되지 않습니다.
직원이 enum에 대한 switch에서 default를 거부하여 컴파일러가 새로운 케이스 추가 후 해당 케이스의 처리가 누락되었음을 확인할 수 있게 했습니다.
장점: 오류가 컴파일 단계에서 발견되고 애플리케이션의 동작이 더 예측 가능해집니다.
단점: 많은 케이스가 필요할 경우 더 많은 코드가 필요하지만, 신뢰성을 얻을 수 있습니다.