实现Equatable Void(None)类型

时间:2015-06-16 18:53:47

标签: swift generics

我正在使用Result实现结果对象,它定义了一个盒装结果,例如带有enum的Optional:

public enum Result<T, Error>: Printable, DebugPrintable {
   case Success(Box<T>)
   case Failure(Box<Error>)
   ...
}

Equatable定义的Result协议如下:

public func == <T: Equatable, Error: Equatable> (left: Result<T, Error>, right: Result<T, Error>) -> Bool

因此,T必须符合Equatable

我希望能够Success设置Void类似的方框。但是,Void不是Equatable,因为它被定义为空元组:

typealias Void = ()

目的是能够拥有Result类型,在成功时我不关心值。

是否可以拥有Equatable Void(或没有价值)?

快速思考,有可能创建一个空的struct,但我正在寻找(如果可能的话)更优雅的解决方案。

2 个答案:

答案 0 :(得分:1)

在Swift 2.0中再次尝试,似乎Void可以初始化为Void()

public enum Result<T, Error: ErrorType> {
    case Success(T)
    case Failure(Error)

    var value: T? {
        switch self {
        case .Success(let v):
            return v
        case .Failure(_):
            return nil
        }
    }

    /// Constructs a success wrapping a `value`.
    public init(value: T) {
        self = .Success(value)
    }

    /// Constructs a failure wrapping an `error`.
    public init(error: Error) {
        self = .Failure(error)
    }
}

enum MyError: ErrorType {
    case AnError
}

let result = Result<Void, MyError>(value: Void())

let success = result.value != nil  // returns true
let error = result.value == nil    // returns false

答案 1 :(得分:0)

为什么不让Success包含一个Optional? (Box<T?>Box<t>?)?

你可以返回零。不利的一面是你要打开你的结果