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가 옵셔널과 비슷하지만 옵셔널보다 더 간단하게 다양한 에러 핸들링을 해줄 수 있는 타입으로 만들어진것 같다고 생각이 들었다.
[참고자료]
스위프트 프로그래밍 (야곰 지음)