Swift version: 5.10
The Result
type lets us encapsulate the success or failure of a method call in a single value, while also storing the contents of the successful return or the type of failure that occurred. More importantly, Result
only stores one of these at a time: it will either be a success or a failure.
For example, we could use Result
to handle networking. First we’d create a NetworkError` enum containing all the things that might go wrong:
enum NetworkError: Error {
case badURL
}
Next we’d write a method that calls a completion handler with some sort of Result
. In this instance we’re going to return the number of unread messages a user has in their inbox, or a NetworkError
if something went wrong:
func fetchUnreadCount(from urlString: String, completionHandler: @escaping (Result<Int, NetworkError>) -> Void) {
guard let url = URL(string: urlString) else {
completionHandler(.failure(.badURL))
return
}
// complicated networking code here
print("Fetching \(url.absoluteString)...")
completionHandler(.success(5))
}
Tip: That code uses a completion handler rather than a simple return type because networking code will block the main thread – we want the method to return immediately and perform any complicated networking code in the background.
We can now call that method with a URL and evaluate what gets sent back. Remember. this will either be a success (sending us back the unread messages count), or a failure (sending us back what went wrong). Here’s the code:
fetchUnreadCount(from: "https://www.hackingwithswift.com") { result in
switch result {
case .success(let count):
print("\(count) unread messages.")
case .failure(let error):
print(error.localizedDescription)
}
}
SAVE 50% All our books and bundles are half price for Black Friday, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.
Available from iOS 8.0
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.
Link copied to your pasteboard.