With Swift 5 a new type got introduced:
@frozen public enum Result<Success, Failure> where Failure : Error {
/// A success, storing a `Success` value.
case success(Success)
/// A failure, storing a `Failure` value.
case failure(Failure)
The Result
type is an enum consisting of 2 cases. The success
and the failure
case. Each of them can hold a generic value. The failure
case, however, is limited to Types extending the Error
type.
Not a big deal? Sure, but it’s the little things which add up and make a difference in the long run.
Lately, I was migrating from SwiftyJSON
to native JSON parsing. Each network call was implemented in the following way:
func fetchSomething(completion: @escaping (SomeReturnValue?, SomeError?) -> Void) {
NetworkingTool.request { (response) in
guard response.isValid
else { completion(nil, .somethingBad); return }
do {
let returnValue = try SomeReturnValue(response: response)
completion(returnValue, nil)
} catch {
completion(nil, .scarry)
}
}
}
Looks okayish. Good. So let’s use it:
fetchSomething { (result, error) in
guard error == nil
else { handleError(error: error); return }
doSomething(result: result)
}
Ok. But how to implement the doSomething
? With an optional? This can’t be right, right? Force unwrap the result? And what about the error case? Force unwrap it? Oh and wait, what about the case where neither a result nor an error is returned? Is this even a thing? Ok, let me look up the implementation…
So a tiny bit of ambiguity paired with different people working on different parts of the network stack for different features can cause a real heterogeneous system. (Which does not imply that this is a bad system!)
If the company you’re working for is in favour of code ownership, you may not encounter this one. But so far no company I worked for was about code ownership. It’s usually your code is my code is our code, comrade. Period. There are simply too many trucks outside.
![](https://www.north-47.com/wp-content/uploads/2020/06/work-harder-comrade-mugs-1024x445.jpg)
As long as code ownership isn’t a thing and you do not want to spend time on endless syntax and architectural discussions with little benefit or enforce a (new) best practice on all of your colleagues. Again. It comes really handy to have a built-in Result
type which is reasonably unambiguous.
And since we all know that we’re spending more time reading code than writing, this saves us all valuable time.