Created
November 18, 2015 11:23
-
-
Save denkeni/88e20a360755f81108a5 to your computer and use it in GitHub Desktop.
Swift Error Handling - A Better Way
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: 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