@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
}