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

标签 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符合 Equatable 的类型, 接受 Result<Void>并且仍然对 T: Equatable 使用正确的相等性检查?这对 Void 没有意义吗?实现Equatable

最佳答案

我认为目前还不可能。 Void 是 空元组 (),并且元组不能采用协议(protocol)(关于 该主题从 [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
    }
}

无需使 Void 本身 Equatable

但是(再次归因于@Hamish)这行不通 因为不允许多重一致性。

关于swift - 如何为通用 Result<T> 类型定义相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606575/

相关文章:

ios - 如何使用触摸快速制作角色 Controller ?

swift - 晦涩的问题,Google AdMob SDK,XCode 8.2 + Cocoapods 集成

java - 将 String 转换为任何所需类的通用代码

C通用双链表每个节点持有多个项目

sql - 在 SQL 中等同 NULL 列的最佳方法是什么?

ios - 在代码中使用 NSManagedObject 模型

ios - Swift 4 - 表达式太复杂,无法在合理的时间内快速解决

linq - .net core - 将函数列表与单个函数组合或合并到单个函数

rust - 如果 f32 不是 Eq,为什么会编译?

JavaScript 数组比较奇怪的行为