Swift
Beginner
1 min read
Implicitly Unwrapped and Result Type
Example
import Foundation
// Result type
enum APIError: Error {
case invalidURL
case networkError(String)
case decodingError
}
func fetchUser(id: Int, completion: @escaping (Result<User, APIError>) -> Void) {
guard let url = URL(string: "https://api.example.com/users/\(id)") else {
completion(.failure(.invalidURL))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(.networkError(error.localizedDescription)))
return
}
guard let data = data else {
completion(.failure(.networkError("No data")))
return
}
guard let user = try? JSONDecoder().decode(User.self, from: data) else {
completion(.failure(.decodingError))
return
}
completion(.success(user))
}.resume()
}
// Handling Result
fetchUser(id: 1) { result in
switch result {
case .success(let user): print("Got user: \(user)")
case .failure(let error): print("Error: \(error)")
}
}
// map / flatMap on Result
let result: Result<String, Error> = .success("42")
let parsed = result.flatMap { str -> Result<Int, Error> in
guard let n = Int(str) else { return .failure(APIError.decodingError) }
return .success(n)
}