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

标签 objective-c swift hashcode

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

相关文章:

ios - 计算 Swift 中的可选属性

java - CHM 没有 ConcurrentModificationException。为什么?

java - 货币实用程序 Java 错误代码 'int java.lang.Object.hashCode()'

ios - 将 NSMutableArray 的内容保存到文件

objective-c - 具有委托(delegate)引用的 ARC 项目编译失败

objective-c - 移除所有 CALayer 的子层

ios - Swift 中的通用 UIView 可确认函数

ios - Swift:将标签与另一个控件放在一起

C# DotNetZip 错误 : The final hash has not been computed. 在 Ionic.Zip.WinZipAesCipherStream.get_FinalAuthentication()

ios - 是否可以在成功发送后为通知回复添加声音,例如 iMessage?