본문 바로가기

Swift

[Swift 문법] if case 를 사용한 패턴매칭

오늘은 Swift 의 if case 를 사용한 패턴매칭에 대해 알아보려합니다.

이름만 들었을땐 이게 뭐지 생각하실 수도 있지만  막상 코드를 보면 아 이럴때 사용하던거였구나 하실 겁니다.

사용하기에 앞서 enum 타입을 먼저 살펴보겠습니다.

 

enum T1 {
    case top(name: String, years: Int)
    case jungle(name: String, years: Int)
    case mid(name: String, years: Int)
    case ad(name: String, years: Int)
    case support(name: String, years: Int)
}

let zeus = T1.top(name: "최우제", years: 4)
let oner = T1.jungle(name: "문현준", years: 4)
let faker = T1.mid(name: "이상혁", years: 12)
let gumayusi = T1.ad(name: "이민형", years: 5)
let keria = T1.support(name: "류민석", years: 5)

 

T1 이라는 enum 타입을 만들고 각각의 case 는 name, years 를 받을 수 있게 되어 있습니다.

faker 객체의 이름과 경력을 가져오고 싶다면 어떻게 할 수 있을까요?

이럴때 사용할 수 있는 것이 if case 입니다.

 

if case let T1.mid(name: name, years: years) = faker {
    print("미드라이너의 이름은 \(name), 경력은 \(years)년 입니다.")
}

 

이렇게 사용하면 아래와 같은 결과를 얻을 수 있습니다.

 

 

이러한 if case 패턴매칭을 실전에선 어떻게 사용할 수 있을까요? 

제가 생각한 간단한 예제는 네트워크 성공, 실패 처리 입니다.

enum NetworkResult {
    case success(Data)
    case failure(Error)
}

 

이와 같이 네트워크 결과를 갖는 enum 타입을 하나 정의해준 후

func handleNetworkResult(_ result: NetworkResult) {
    if case .success(let data) = result {
        print("Data received: \(data)")
    } else if case .failure(let error) = result {
        print(#fileID, #function, #line, "Error: \(error.localizedDescription)")
    }
}

 

handleNetworkResult 메서드의 파라미터로 enum 타입을 정의해준 후 if case 를 사용하여 성공, 실패를 나누어 줍니다. 

 

처음 살펴본 예제의 경우 faker 객체를 직접 만들어준 후 if case 를 사용했기에 값을 가져오기 수월했지만, 지금과 같이

result 값이 없는 상태에선 어떻게 해야할까요?

func fetchData(completion: (NetworkResult) -> Void) {
    
    let success = true // 데이터를 얻어왔다고 가정
    
    if success {
        let data = Data()
        completion(.success(data))
    } else {
        let error = NSError(domain: "NetworkError", code: 1)
        completion(.failure(error))
    }
}

fetchData { result in
    handleNetworkResult(result)
}

 

이런 경우엔 completion 핸들러를 사용하여 NetworkResult 타입의 결과 넘겨주는 방법을 사용하게 됩니다.

 

이와같이 API를 사용하여 데이터를 호출하고, 호출의 결과를 성공 혹은 실패 처리했던 경험을 떠올리면 어렵지 않게

이해하실 수 있을거라 생각합니다 🙂

'Swift' 카테고리의 다른 글

[Swift 문법] 프로토콜을 사용한 조건문 줄이기  (1) 2024.06.30