我想创建一个集合,但是我不想使用已经为对象定义的哈希函数。有没有办法提供唯一/散列函数?
我有一个对象:
class Foo {
var uuid: UUID
var name: String
var hash: Int {
return uuid.hash
}
}
我的对象由uuid唯一。但是我想要一组所有Foo的独特名称。
为此,我知道一些选择:
1)使用键作为我选择的唯一键和对象的值创建字典,然后调用.values
2)使用内部循环检查密钥是否已经存在的双for循环
我假设Set内部在执行类似上面的选项1的操作,但是我想知道是否有某些特定的快速操作。我总是可以创建一个扩展使其成为一行,但是那不是我想要的。
答案 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的所有名称。