Cocoa touch 对NSD字典中的密钥有什么要求?

Cocoa touch 对NSD字典中的密钥有什么要求?,cocoa-touch,nsdictionary,Cocoa Touch,Nsdictionary,在本例中,我需要使用我在NSMutableDictionary中作为键编写的自定义类作为套接字类 在Java中,当我使用HashMap或TreeMap时,对象分别需要一个哈希函数或比较器函数,字典才能运行。一般来说,字典需要知道一些比较键的方法 从我在文档中读到的内容来看,使用NSMutableDictionary似乎不需要这样做。对吗?如果是,有人知道他们是如何实现密钥比较的吗?只要密钥符合NSCopying,而NSObject不符合,但很多事情都符合,它就可以用作密钥。将使用copyWith

在本例中,我需要使用我在NSMutableDictionary中作为键编写的自定义类作为套接字类

在Java中,当我使用HashMap或TreeMap时,对象分别需要一个哈希函数或比较器函数,字典才能运行。一般来说,字典需要知道一些比较键的方法


从我在文档中读到的内容来看,使用NSMutableDictionary似乎不需要这样做。对吗?如果是,有人知道他们是如何实现密钥比较的吗?

只要密钥符合NSCopying,而NSObject不符合,但很多事情都符合,它就可以用作密钥。将使用copyWithZone复制密钥:


关于它是如何工作的,正如您在Java中所注意到的那样。该对象需要哈希函数或比较器函数来分别操作字典。每个NSObject都实现了hash和isEqual:。

只要密钥符合NSCopying,而NSObject不符合,但很多情况下,它可以用作密钥。将使用copyWithZone复制密钥:


关于它是如何工作的,正如您在Java中所注意到的那样。该对象需要哈希函数或比较器函数来分别操作字典。每个NSObject都同时实现哈希和isEqual:。

哈希的默认实现基于对象的实例地址,因此在NSDictionary中用作密钥可能不是一个好选项。因此,默认情况下,类的两个逻辑上相等的实例将映射到字典中的两个不同条目,直到您正确重写-isEqual和-hash以反映您的逻辑


除此之外,您还绝对需要正确重写-copyWithZone:以反映您的相等逻辑,因为NSDictionary复制它的键。

默认的-hash实现基于对象的实例地址,因此在NSDictionary中用作键可能不是一个好的选择。因此,默认情况下,类的两个逻辑上相等的实例将映射到字典中的两个不同条目,直到您正确重写-isEqual和-hash以反映您的逻辑

除此之外,您绝对需要正确重写-copyWithZone:以反映您的相等逻辑,因为NSDictionary复制它的键