✅ Result 타입이란?
Result는 Swift 5.0에서 추가된 표준 라이브러리 타입으로, 성공과 실패를 명확하게 구분하는 enum
enum Result<Success, Failure: Error> {
case success(Success)
case failure(Failure)
}
✅ Result의 장점
1. 명확한 상태 표현
// ❌ 기존 방식 - 4가지 상태 가능 (애매함)
func oldStyle(completion: @escaping (Int?, NetworkError?) -> Void) {
// (data, nil), (nil, error), (data, error), (nil, nil) - 뭐가 뭔지?
}
// ✅ Result 방식 - 2가지 상태만 (명확함)
func newStyle(completion: @escaping (Result<Int, NetworkError>) -> Void) {
// 성공 또는 실패, 둘 중 하나만!
}
2. 타입 안전성
enum NetworkError: Error {
case badURL
case noConnection
}
// 강타입 에러 - 어떤 에러가 올지 명확함
func fetchData() -> Result<String, NetworkError> {
// 반환되는 에러는 반드시 NetworkError
}
✅ 기본 사용법
Result 생성하기
// 성공 케이스
let success: Result<String, NetworkError> = .success("데이터 로드 완료")
// 실패 케이스
let failure: Result<String, NetworkError> = .failure(.badURL)
// throwing 클로저로 생성
let result = Result { try String(contentsOfFile: "file.txt") }
Result 처리하기
func handleResult(_ result: Result<String, NetworkError>) {
switch result {
case .success(let data):
print("성공: \(data)")
case .failure(.badURL):
print("잘못된 URL")
case .failure(.noConnection):
print("연결 없음")
}
}
✅ Result vs throws 비교
throws 사용이 좋은 경우
// 동기 작업, 즉시 처리
func parseJSON<T: Codable>(_ data: Data, as type: T.Type) throws -> T {
return try JSONDecoder().decode(type, from: data)
}
// 간단한 사용
do {
let user = try parseJSON(data, as: User.self)
updateUI(with: user)
} catch {
showError(error)
}
Result 사용이 좋은 경우
// 비동기 작업, 나중에 처리
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
// 나중에 호출될 콜백
}
// 함수형 스타일 체이닝
fetchUserData()
.map { $0.name }
.map { $0.uppercased() }
'Swift' 카테고리의 다른 글
[Swift] Singleton에서의 private init() (0) | 2025.06.20 |
---|---|
[Swift] Any와 AnyObject (0) | 2025.06.12 |
[Swift] 캡처리스트와 순환참조 (1) | 2025.06.05 |
[Swift] 고차함수 더 이상 헷갈리지 않기 (0) | 2025.06.04 |
[WWDC] ARC in Swift (0) | 2025.05.30 |