Result 타입

인생노잼시기·2021년 10월 14일
0

🦅 스위프트 문법

목록 보기
12/13

@frozen enum Result<Success, Failure> where Failure : Error

import UIKit

enum MyError: Error {
    case SomethingInvalid
    case SomeOtherError
}

let result: Result<String, Error> = .success("something")
let result2: Result<String, Error> = .failure(MyError.SomeOtherError)

// MARK: - Result를 사용하지 않으면, (성공/실패)(에러유/무) 4가지의 경우가 나온다
//func doSomething(completion: (Bool, Date?) -> Void) {
//
//}

//doSomething(completion: { success, data in
//    if success {
//        guard let resultData = data else {
//            return
//        }
//    } else {
//        //...
//    }
//})

// MARK: - Result를 사용하면, (성공/실패) 2가지의 경우만 고려하면 된다
func doSomething(completion: (Result<Date, MyError>) -> Void) {
    
}

doSomething(completion: { result in
    switch result {
    case .success(let data):
    case .failure(let error):
    }
})

예제

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        APICaller.shared.fetch(with: "api.google.com/something") { result in
            switch result {
            case .success(let data):
            case .failure(let error):
                break
            }
        }	//1
    }


}

class APICaller {
    static let shared = APICaller()     //static 인스턴스 생성
    
    enum MyError: Error {
        case failedToFetch
        case anotherError
    }
    
    func fetch(with url: String, completion: @escaping(Result<Data, Error>) -> Void) {
        let task = URLSession.shared.dataTask(with: URL(string: url)!) { data, response, error in
            guard let data = data else {
                completion(.failure(MyError.failedToFetch))
                return
            }
            
            if error == nil {
                completion(.success(data))
            } else {
                completion(.failure(MyError.anotherError))
            }
        }
        task.response
    }	//2
}
  1. api를 가져오고 completion handler로 Result객체를 사용해서 .success와 .failure 두 가지 경우로 축약시켰다
  2. completion handler로 Result객체를 사용해서 data가 있는지 확인하고 성공/실패 아니라 data가 있으면 성공하는 식으로 경우를 줄여서 나타낼 수 있게 되었다.

https://jusung.github.io/Result-타입/

profile
인생노잼

0개의 댓글