make struct Hashable?

时间:2017-02-01 05:12:19

标签: swift dictionary swift3 hashable

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

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

所以我想以某种方式使它成为可散列但它的组件都不是var hashValue: Int所需的整数。如果它的字段都不是整数,我怎样才能使它符合协议?我是否可以使用dbName,如果我知道它对于此结构的所有实例都是唯一的?

2 个答案:

答案 0 :(得分:46)

只需从dbName.hashValue功能返回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
    }
}

答案 1 :(得分:1)

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

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