Sign In
한결
Status
Empty
Assignee
Empty
Result Enum Type
실패와 성공의 케이스만 가지는 @frozen된 열거형 타입이다.
@frozen public enum Result<Success, Failure> where Failure : Error { /// A success, storing a `Success` value. case success(Success) /// A failure, storing a `Failure` value. case failure(Failure) .. }
제네릭으로 성공, 실패의 케이스에 사용될 '타입'을 선언해서, associated value로 저장해준다.
네트워크 통신을 하는 API 코드에서 completionHanlder의 인자로 Result Enum Type을 지정해주면, 내부 응답 핸들링 코드에서 편하게 사용해볼 수 있다.
func fetch<T: Decodable> ( of decodable: T.Type, completionHandler: @escaping (Result<T, Error>) -> () ) { URLSession.shared.dataTask(with: someRequest) { data, _, error in if let error { // .failure 케이스에 associated value의 값으로 에러를 담아준다. completionHandler(.failure(error)) return } guard let data else { completionHanlder(.failure(NSError(domain: "No Data", code: 0, userInfo: nil))) return } do { let result = try JSONDecoder().decode(T.self, from: data) completionHanlder(.success(result)) } catch { completionHanlder(.failure(error)) } } }
of: T.Type 을 인자로 둔 이유는, fetch<T> 메서드 자체를 호출하는 환경에서 Result<T, Error> 열거형에 T라고 하는 Decodable한 타입을 맵핑해주기 어려워서이다.
Alamofire의 API를 활용할 때에도 decodeOf 등으로 decoding 할 데이터 타입을 먼저 맵핑해준다.
👍