Skip to content

Instantly share code, notes, and snippets.

@denkeni
Created November 18, 2015 11:23
Show Gist options
  • Save denkeni/88e20a360755f81108a5 to your computer and use it in GitHub Desktop.
Save denkeni/88e20a360755f81108a5 to your computer and use it in GitHub Desktop.
Swift Error Handling - A Better Way
//: Playground - noun: a place where people can play
// 1. Proposed Error Handling
enum Error: ErrorType {
case IsNegative(String)
case IsPositive(String)
}
func isZero(number: Int) -> Error? {
if number != 0 {
if number > 0 {
return Error.IsPositive("\(number) is positive!")
} else {
return Error.IsNegative("\(number) is negative!")
}
}
return nil // success
}
// 2. Return Result Cases Wrapper
enum IsZeroResult<T> {
case Success(T)
case Failure(Error)
}
func isZero_2(number: Int) -> IsZeroResult<Bool> {
if let err = isZero(number) {
return IsZeroResult.Failure(err)
}
// return Result.Success(T)
return IsZeroResult.Success(true)
}
// 3. Do-try-catch Error Handling Wrapper
func isZero_3(number: Int) throws {
if let err = isZero(number) {
throw err
}
}
// Implementation
let number = 1
// 1.
if let err = isZero(number) {
switch err {
case .IsNegative(let message):
print(message)
case .IsPositive(let message):
print(message)
}
}
// 2.
switch isZero_2(number) {
case .Failure(let err):
switch err {
case .IsNegative(let message):
print(message)
case .IsPositive(let message):
print(message)
}
case .Success(let bool):
break
}
// 3.
do {
try isZero_3(number)
} catch let err as Error {
switch err {
case .IsNegative(let message):
print(message)
case .IsPositive(let message):
print(message)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment