タイトルではEitherといいながら片方がErrorType決め打ちなのでFailable型ということで。 enum Failable<T> { case Success(T) case Failure(ErrorType) init(@autoclosure _ f: () throws -> T) { do { self = .Success(try f()) } catch { self = .Failure(error) } } } enum MyError : ErrorType { case ParseIntError(String) case PatternNotFoundError(String, String) } func parseInt(text: String) throws -> Int { if let num = Int(text) { return num