我有一个定义词典的类:

class InventoryDictionary <U : Hashable, V> : Equatable {

    var dictionary : [ U : V? ]  = [:]

    static func ==(lhs: InventoryDictionary, rhs: InventoryDictionary) -> Bool {
       return    lhs.dictionary.keys == rhs.dictionary.keys
              && lhs.dictionary.values == rhs.dictionary.values
    }
}

Xcode显示错误:

Referencing operator function '==' on 'Equatable' requires that 'Dictionary.Values' conform to 'Equatable'

我正在努力使InventoryDicary符合Equatable SWIFT协议.

==重载函数中,可以比较dictionary.keys是否相等,但不能比较值(这在某种程度上是可以理解的).

但从消息中我不清楚,如果不编写代码判断每个V(值),这是否可以解决,或者是否有某种方法可以使SWIFT-GENERIC V相等.

解决这一问题的好方法是什么?

推荐答案

首先,V也必须是Equatable.也就是说,申报应该是

class InventoryDictionary<U: Hashable, V: Equatable> : Equatable {

然而,你不应该使用class.对于这个用例,您最好使用struct,因为这样会为您生成均衡性.

struct InventoryDictionary<U: Hashable, V: Equatable> : Equatable {
    var dictionary: [U: V] = [:]
}

如果您确实需要将其作为引用类型:

class InventoryDictionary<U: Hashable, V: Equatable> : Equatable {
    var dictionary: [U: V] = [:]

    static func ==(lhs: InventoryDictionary, rhs: InventoryDictionary) -> Bool {
        return lhs.dictionary == rhs.dictionary
    }
}

注意,我还从DICIONARY值中删除了OPTIONAL.它不应该在那里,除非你真的想用nil值来存储密钥.

Swift相关问答推荐

解析SON数据的API调用有什么问题?

同步问题,发送Api Call之前未设置idToken

是否有一个Kotlin等价的Swift s @ AddendableReport注释'

如何返回JSON数据?

如何在SWIFT中解码Instagram Backup中的字符串?

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

SWIFT:使字典数组值可变

修改数组中每个类实例的属性

出错-无法将季节类型的值转换为预期的参数类型';[水果]';

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

在Swift中如何用变量计算0.9的立方

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

如何在 SceneKit 上制作毛玻璃效果

使用 Async-Await 和 Vapor-Fluent 创建 CRUD 函数 - Swift 5.6

SwiftUI View .tint(_ Color) 方法不起作用

如何在 Swift 中使用子定义覆盖父类扩展

Swift Components.Url 返回错误的 URL

如何有条件地格式化 SwiftUI 代码

swift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载

如何在 Swift 中重写 setter