import Foundation extension Optional { @discardableResult func ifSome(_ handler: (Wrapped) -> Void) -> Optional { switch self { case .some(let wrapped): handler(wrapped); return self case .none: return self } } @discardableResult func ifNone(_ handler: () -> Void) -> Optional { switch self { case .some: return self case .none(): handler(); return self } } } struct Person { let name: String } var p: Person? = Person(name: "Joe") p.ifSome { print($0) }.ifNone { print("none") } // prints Person p = nil p.ifSome { print($0) }.ifNone { print("none") } // prints none