Skip to content

Instantly share code, notes, and snippets.

@brennanMKE
Last active August 29, 2018 11:38
Show Gist options
  • Save brennanMKE/6cb8ab365978cf5db94c826df8b9f5ef to your computer and use it in GitHub Desktop.
Save brennanMKE/6cb8ab365978cf5db94c826df8b9f5ef to your computer and use it in GitHub Desktop.
Tiny Result type in Swift
// Credit: Hooman Mehr via swift-evolution
// https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20171113/041314.html
import Foundation
public enum Result<Value> {
case success(Value)
case failure(Error)
public init(_ value: Value) { self = .success(value) }
public init(error: Error) { self = .failure(error) }
public init(_ expression: @autoclosure () throws -> Value) {
do {
self = .success(try expression())
}
catch {
self = .failure(error)
}
}
public init(_ closure: () throws -> Value) {
do {
self = .success(try closure())
}
catch {
self = .failure(error)
}
}
public func get() throws -> Value {
switch self {
case let .success(value): return value
case let .failure(error): throw error
}
}
public func map<U>(_ transform: (Value) throws -> U) throws -> U {
return try transform(get())
}
public var value: Value? {
switch self {
case let .success(value): return value
case .failure: return nil
}
}
public var error: Error? {
switch self {
case .success: return nil
case let .failure(error): return error
}
}
}
func doSomething() -> Result<String> {
return Result("Done!")
}
let result = doSomething()
do {
let value = try result.get()
print(value)
}
catch {
print(error)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment