Sign In
상태
Empty
담당자
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 할 데이터 타입을 먼저 맵핑해준다.
👍