Swift

[Swift] Result 타입

양밀루 2025. 6. 17. 20:37

✅ 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