如何使用自定义哈希函数创建集合

时间:2018-12-04 01:19:10

标签: swift

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

我有一个对象:

class Foo {
   var uuid: UUID
   var name: String

   var hash: Int {
      return uuid.hash
   }
}

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

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

我假设Set内部在执行类似上面的选项1的操作,但是我想知道是否有某些特定的快速操作。我总是可以创建一个扩展使其成为一行,但是那不是我想要的。

2 个答案:

答案 0 :(得分:-1)

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,请执行上面显示的操作。

答案 1 :(得分:-1)

  

有没有办法提供唯一/散列功能?

否。 Swift 4.2确实让集合提供了哈希函数,但是看起来Set始终使用Hasher的实例,描述为: Set和Dictionary使用的通用哈希函数。没有明显的公共接口来设置给定set使用的哈希函数。 (如果您对详细信息感兴趣,请阅读Swift 4.2 improves Hashable with a new Hasher struct。)

  

我想要一组所有Foo的独特名称。

可能有比散列函数更简单的方法。如果您要包含一组具有唯一名称的所有Foos,则可以将所有Foos的名称添加到NSCountedSet中,然后选择计数为1的所有名称。