如何定义通用Result <t>类型的相等性?

时间:2017-12-02 09:51:42

标签: swift generics equality

我有一个简单的Result类型:

public enum Result<T> {
    case success(T)
    case error
}

我想制作类型Equatable,这很简单:

public enum Result<T: Equatable>: Equatable {

    case success(T)
    case error

    // definition of ==
}

但后来我想使用Result<Void>,这是一个类型错误,因为Void不符合Equatable。有没有办法定义符合Result的{​​{1}}类型,接受Equatable并仍然使用Result<Void>的正确等式检查? T: Equatable实施Void是否有意义?

1 个答案:

答案 0 :(得分:2)

我认为目前无法做到这一点。 Void是的类型 空元组(),元组不能采用协议(关于 该主题从[swift-evolution] Synthesizing Equatable, Hashable, and Comparable for tuple types开始。

可能的解决方法(如上面@Hamish所建议的)是使用自定义 键入而不是Void

struct Unit: Equatable {
    static var unit = Unit()
    public static func ==(lhs: Unit, rhs: Unit) -> Bool {
        return true
    }
}

let res = Result.success(Unit.unit)

我最初虽然实现了SE-0143 Conditional conformances,但可以定义

public enum Result<T> {
    case success(T)
    case error
}

public extension Result: Equatable where T: Equatable {
    public static func ==(lhs: Result, rhs: Result) -> Bool {
        // ...
    }
}

public extension Result: Equatable where T == Void {
    public static func ==(lhs: Result, rhs: Result) -> Bool {
        return true
    }
}

不需要make Void本身Equatable

然而(再次归属于@Hamish)这不会起作用 因为不允许多种一致性。