首页 > 解决方案 > 如何使用自定义哈希函数创建 Set

问题描述

我想创建一个集合,但我不想使用我已经为我的对象定义的散列函数。有没有办法提供唯一/散列函数?

我有一个对象:

class Foo {
   var uuid: UUID
   var name: String

   var hash: Int {
      return uuid.hash
   }
}

我的对象是 uuid 唯一的。但我想要一组所有 Foo 唯一的名称。

为此,我知道几个选项:1)使用键作为我选择的唯一键和我的对象的值创建字典,然后调用.values 2)使用内部循环检查键是否已经存在的双 for 循环

我假设 Set 内部正在执行类似于上面的选项 1 的操作,但我想知道是否有特定于 swift 的东西。我总是可以创建一个扩展来使其成为一条线,但这不是我所追求的。

标签: swift

解决方案


class YourClass{
    enum HashChoice{
        case first
        case second
    }

    var hashChoice : HashChoice = .first

    public init(){}
}

extension YourClass : Hashable{
    public var hashValue: Int {
        switch hashChoice{
        case .first:
            // your implementation of first hashValue
        case .second:
            // your implementation of second hasValue
        }
    }

    static func == (lhs: YourClass, rhs: YourClass) -> Bool {
        return lhs.hashvalue == rhs.hasValue
    }
}

我不知道我的问题是否正确。这对我来说听起来很模棱两可。但如果你想拥有不同的 hashingFunction,就按照我上面展示的去做。


推荐阅读