我有一个普通的类型:

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

我想让类型Result足够简单:
public enum Result<T: Equatable>: Equatable {

    case success(T)
    case error

    // definition of ==
}

但是我想使用Equatable,这是一个类型错误,因为Result<Void>不符合Void。有没有一种方法可以定义一个符合EquatableResult类型,接受Equatable并仍然对Result<Void>使用正确的相等性检查?实现T: Equatable是否有意义?

最佳答案

我认为目前不可能。Void
空元组,元组不能采用协议(关于
该主题从[swift-evolution] Synthesizing Equatable, Hashable, and Comparable for tuple types开始。
可能的解决方法(如上面@hamish所建议的)是使用自定义
键入而不是()

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
    }
}

不需要品牌本身。
但是(同样归属于@hamish)这不起作用
因为不允许多个符合项。

10-08 09:31