Swift

[Swift]switch문 대신 if, guard 사용하기

양밀루 2025. 5. 28. 13:53

 

Optional pattern을 보다가 생소한 문법을 발견했다

let someOptional: Int? = 42
// Match using an enumeration case pattern.
if case .some(let x) = someOptional {
    print(x)
}

옵셔널은 enum타입으로 구현되어 있는데, 이렇게 if case 문으로 한가지 case만 처리하는 신기한 문법..!

 

if case, guard case

enum NetworkResult {
    case success(data: String)
    case failure(code: Int, message: String)
    case noConnection
}

let result: NetworkResult = .failure(code: 404, message: "Not Found")

// if case
if case .noConnection = result {
    print("네트워크 연결 없음")
} else {
    print("연결 상태 OK")  // 이 줄이 실행됩니다.
}

// guard case
func handle(_ r: NetworkResult) {
    guard case .success = r else {
        print("성공이 아니므로 함수 종료")
        return
    }
    print("성공 케이스, 계속 처리")  // 이 줄은 실행되지 않음
}
handle(result)

 

 

if case let, guard case let

let 사용해 연관값 바인딩

// if case let
if case let .success(data) = result {
    print("데이터 수신: \(data)")
} else {
    print("성공 케이스가 아닙니다")  // 이 줄이 실행됩니다.
}

// guard case let
func process(_ r: NetworkResult) {
    guard case let .failure(code, message) = r else {
        print("실패 케이스가 아니므로 다른 처리")
        return
    }
    print("실패 코드: \(code), 메시지: \(message)")  // 이 줄이 실행됩니다.
}
process(result)

 

 

 

 

✅ Optinal pattern

let someOptional: Int? = 42
// Match using an enumeration case pattern.
if case .some(let x) = someOptional {
    print(x)
}

// Match using an optional pattern.
if case let x? = someOptional {
    print(x)
}
let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]

// Match only non-nil values.
for case let number? in arrayOfOptionalInts {
    print("Found a \(number)")
}
// Found a 2
// Found a 3
// Found a 5

 

만약 for number in ~ 으로 쓰면 반복문이 5번 실행되는데 반해,

위와 같이 Optinal pattern을 사용하면 값이 nil일땐 반복문을 실행하지 않아 반복문이 3번만 실행된다