Swift

Result

GREEN.1229 2021. 4. 28. 20:36

안녕하세요. 그린입니다🟢

이번 포스팅에서는 Result 타입에 대해 알아보겠습니다🧑🏻‍💻

 

Result?

 - 성공 / 실패에 대한 정보를 담는 제네릭 열거형 타입

 - 옵셔널과 유사하지만 값이 없지가 않음 (실패 케이스에도 오류에 대한 정보 존재)

 

Result 분석 

@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)
    //...
    
    }

 - @frozen: Objective-C에서 건너온 Enum에 새로운 케이스가 업데이트 되지 않는것을 보장되는 키워드

 

Result 활용

func requestURLSession<T: Decodable>(completion: @escaping (Result<T, Error>)->()) {
    var request = URLRequest(url: URL(string: "https://localhost:8080")!)
    request.method = .get
    
    URLSession(configuration: .default).dataTask(with: request) { (data, res, error) in
        if let error = error {
            completion(.failure(.error(error)))
        } else if let data = data {
            let jsonDecoder = JSONDecoder()
            if let decoded = try? jsonDecoder.decode(T.self, from: data) {
                completion(.success(decoded))
            } else {
                completion(.failure(.basic))
            }
        }
        }.resume()
    }
}

 - 주로 API 통신 시 자주 사용됨 (통신 요청에 대한 성공과 실패로 처리)

 - Result 타입을 사용하면 명확한 에러 처리가 가능

 

[느낀점]

서버 통신을 하며 Result를 처음 접했었다. Result가 옵셔널과 비슷하지만 옵셔널보다 더 간단하게 다양한 에러 핸들링을 해줄 수 있는 타입으로 만들어진것 같다고 생각이 들었다.

 

[참고자료]

스위프트 프로그래밍 (야곰 지음)

jusung.github.io/Result-타입/