gpt4 book ai didi

objective-c - 如何在 Swift 中实现 hashCode() 供 NSDictionary 使用?

转载 作者:行者123 更新时间:2023-11-30 14:15:35 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com