Either
type implementation for Swift.
Scala's Either inspires the development of this Either type for Swift.
Either represents a value of one of two possible types (a disjoint union). An instance of Either
is an instance of either left
or right
.
A common use of Either is as an alternative to Optional for dealing with possibly missing values. In this usage, Optional.none
is replaced with a Either.left
, which can contain useful information; and a Either.right
takes the place of Optional.some
.
Another common use of Either is as an alternative to Result without strictly constraining the conformance to the Error
protocol. In this usage, Result.failure
is replaced with a Either.left
; and a Either.right
takes the place of Result.success
.
NOTE: Convention dictates that Either.left
is used for failure and Either.right
is used for success - but this IS NOT mandatory.
A pretty simple example of possible use for Either is a function that may fail or produce a result.
For example, let's say we are doing a division operation and have to get an error message when dividing by 0.
typealias ErrorMessage = String
func divide<Number>(
number dividend: Number,
by divisor: Number
) -> Either<ErrorMessage, Number>
where Number: FloatingPoint {
guard !divisor.isZero else {
return .left("'\(dividend)' cannot be divided by '\(divisor)'")
}
return .right(dividend / divisor)
}
// ...
let eitherValue = divide(number: <some-number>, by: <divisor>)
switch eitherValue {
case let .left(errorMessage):
presentErrorAlert(with: errorMessage) // '<some-number>' cannot be divided by '0.0'
case let .right(result):
updateView(with: result)
}