我正在尝试使用 Swift 对象作为 NSMutableDictionary 中的键。我像往常一样实现了 hashValue 和 equal,并且它在 native Swift 字典中工作。但 NSMutableDictionary 从不调用我的哈希函数。我错过了什么?
public final class Holder : Hashable, NSCopying
{
var val : Int = 0
public init( _ val : Int ) { self.val = val }
public var hashValue: Int {
return val
}
@objc public func copyWithZone(zone: NSZone) -> AnyObject {
return self
}
}
public func == (lhs: Holder, rhs: Holder) -> Bool {
return lhs.val==rhs.val
}
//var dict = Dictionary<Holder,String>()
var dict = NSMutableDictionary()
dict[ Holder(42) ]="foo"
dict[ Holder(42) ] // NSMutableDictionary will not call my hash function, returns nil here.
答案:
我必须像这样显式实现 hash() 和 isEqual() :
@objc public func hash() -> Int {
return hashValue
}
@objc public func isEqual( obj : AnyObject ) -> Bool {
return (obj as? Holder)?.val == val
}
最佳答案
NSDictionary 使用 hash
and isEqual
methods来自 NSObjectProtocol:
@objc var hash: Int { return hashValue }
@objc func isEqual(o: AnyObject?) -> Bool { return o as? Holder == self }
// ...
dict[ Holder(42) ] = "foo"
dict[ Holder(42) ] // returns "foo"
但是,如果可能的话,我建议坚持使用 Swift 字典 [Holder:String]
,就像您之前尝试过的那样。
关于objective-c - 如何在 Swift 中实现 hashCode() 供 NSDictionary 使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31234007/