Swift에서는 패턴 매칭을 활용하여 값을 추출하는 다양한 문법을 제공한다. 그 중 if case let
과 guard case let
은 특정 패턴과 일치하는 경우 값을 바인딩하는 데 유용하다. 이 글에서는 두 문법의 차이점과 사용법을 정리한다.
if case let
문법
if case let
은 특정 패턴과 값이 일치할 때만 실행되는 조건문으로, switch
문을 사용하지 않고도 패턴 매칭을 수행할 수 있다.
if case 패턴 = 값 {
// 패턴이 일치하는 경우 실행되는 코드
}
enum Status {
case success(code: Int)
case failure(message: String)
}
let result = Status.success(code: 200)
if case let .success(code) = result {
print("요청 성공, 응답 코드: \(code)")
} else {
print("요청 실패")
}
// 출력: 요청 성공, 응답 코드: 200
guard case let
문법
guard case let
은 특정 패턴과 일치하지 않으면 즉시 함수에서 빠져나가는(early exit) 방식으로 사용된다. 이를 통해 코드 흐름을 단순하게 만들 수 있다.
guard case 패턴 = 값 else {
// 패턴이 일치하지 않는 경우 실행되는 코드 (early exit)
return
}
// 이후 코드 실행 (패턴이 일치하는 경우만)
func handleResult(_ result: Status) {
guard case let .success(code) = result else {
print("요청 실패")
return
}
print("요청 성공, 응답 코드: \(code)")
}
let result = Status.success(code: 200)
handleResult(result)
// 출력: 요청 성공, 응답 코드: 200
let failedResult = Status.failure(message: "Not Found")
handleResult(failedResult)
// 출력: 요청 실패
if case let
vs guard case let
비교
비교 항목 |
|
|
사용 목적 | 특정 패턴과 일치하는 경우 실행 | 특정 패턴과 일치하지 않으면 early exit |
제어 흐름 | 일반적인 |
|
실행 범위 |
|
|
옵셔널 값과 함께 사용하기
if case let
과 guard case let
은 옵셔널 값이 특정 패턴을 만족하는지 검사하는 데도 사용 가능하다.
let someValue: Int? = 42
if case let value? = someValue {
print("옵셔널 해제된 값: \(value)")
}
guard case let value? = someValue else {
fatalError("값이 없음")
}
print("옵셔널 해제된 값: \(value)")
if case let value? = someValue
는 someValue
가 nil
이 아닐 때만 실행된다. guard case let
을 사용하면 nil
인 경우 바로 종료되므로 안전한 처리가 가능하다.
여러개의 패턴 매칭 (튜플 활용)
튜플과 함께 사용하면 더 강력한 패턴 매칭이 가능하다.
let person = ("춘장", 25)
if case let (name, age) = person, age > 20 {
print("\(name)은 성인입니다.")
}
// 출력: 춘장은 성인입니다.
func checkPerson(_ person: (String, Int)) {
guard case let (name, age) = person, age > 20 else {
print("미성년자입니다.")
return
}
print("\(name)은 성인입니다.")
}
checkPerson(("메주", 17))
// 출력: 미성년자입니다.
튜플 패턴을 활용하면 여러 값을 한 번에 추출하고 조건을 추가할 수 있다. if case let
은 특정 조건을 만족할 때 실행하고, guard case let
은 조건을 만족하지 않으면 빠져나가도록 할 수 있다.