오늘은 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 문법] 빈 문자열을 확인하기 위한 가장 효율적인 방법은 무엇일까? (0) | 2024.11.21 |
---|---|
[Swift 문법] 프로토콜을 사용한 조건문 줄이기 (1) | 2024.06.30 |