【问题标题】:Make struct Hashable?使结构可散列?
【发布时间】:2017-06-17 18:13:55
【问题描述】:

我正在尝试创建 [petInfo : UIImage]() 类型的字典,但我收到了错误 Type 'petInfo' does not conform to protocol 'Hashable'。我的 petInfo 结构是这样的:

struct petInfo {
    var petName: String
    var dbName: String
}

所以我想以某种方式使其可散列,但它的所有组件都不是var hashValue: Int 所要求的整数。如果它的字段都不是整数,我怎样才能使它符合协议?如果我知道这个结构的所有出现都是唯一的,我可以使用dbName 吗?

【问题讨论】:

    标签: swift dictionary swift3 hashable


    【解决方案1】:

    只需从您的 hashValue 函数返回 dbName.hashValue。仅供参考 - 哈希值不需要是唯一的。要求是相等的两个对象也必须具有相同的哈希值。

    struct PetInfo: Hashable {
        var petName: String
        var dbName: String
    
        var hashValue: Int {
            return dbName.hashValue
        }
    
        static func == (lhs: PetInfo, rhs: PetInfo) -> Bool {
            return lhs.dbName == rhs.dbName && lhs.petName == rhs.petName
        }
    }
    

    【讨论】:

    • 哦,很高兴知道!您介意解释一下您添加的static func 吗?
    • Hashable 扩展了 Equatable。有关== 函数的完整说明,请参阅这两个协议的文档。
    【解决方案2】:

    从 Swift 5 开始,var hashValue:Int 已被弃用,取而代之的是 func hash(into hasher: inout Hasher)(在 Swift 4.2 中引入),因此更新@rmaddy 给出的答案:

    func hash(into hasher: inout Hasher) {
        hasher.combine(dbName)
    }
    

    【讨论】:

    • 你应该直接说hasher.combine(dbName),因为String已经继承自Hashable。此外,您需要实现 == 运算符,并且“用于散列的组件必须与您类型的 == 运算符实现中比较的组件相同”,定义为here
    • @jangelsb 关于String 的好点 - 已更新。一般不会在Hashable 协议上扩展此答案,因为它实际上只是原始答案的附录。
    • @jangelsb 评论是金!实现== 是绝对必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2014-09-28
    • 2011-12-31
    • 2016-10-26
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多