如何为通用 Result<T> 类型定义相等性?

How do I define equality for a generic Result<T> type?

我有一个简单的 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。有没有一种方法可以定义符合 Equatable、接受 Result<Void> 并且仍然对 T: Equatable 使用正确的相等性检查的 Result 类型? Void 实施 Equatable 没有意义吗?

我认为目前还不可能。 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)这行不通 因为不允许多重一致性。