Iphone NSDictionary能否将NSSet作为密钥?

Iphone NSDictionary能否将NSSet作为密钥?,iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,我知道您可以使用任何对象作为NSDictionary的键,但问题是它是否能够检索到正确的值?支持我有一个条目,其中key={1,3,5}和value={@“hello”}。我是否能够通过传入集合{3,5,1}从这个字典条目中检索 换句话说,键是基于指针匹配的,还是它实际上比较了集合的内容?(如果是前者,我如何克服它?是的 在irb中试试这个: require 'osx/cocoa' abc=OSX::NSSet.setWithArray([1,2,3]) cba=OSX::NSSet.setWi

我知道您可以使用任何对象作为NSDictionary的键,但问题是它是否能够检索到正确的值?支持我有一个条目,其中key={1,3,5}和value={@“hello”}。我是否能够通过传入集合{3,5,1}从这个字典条目中检索

换句话说,键是基于指针匹配的,还是它实际上比较了集合的内容?(如果是前者,我如何克服它?

是的

在irb中试试这个:

require 'osx/cocoa'
abc=OSX::NSSet.setWithArray([1,2,3])
cba=OSX::NSSet.setWithArray([3,2,1])
dict=OSX::NSMutableDictionary.dictionary
dict[abc] = 'hello'
puts dict[cba]

(它是有效的,因为isEqual:for NSSet在您预期的情况下是正确的,NSDictionary的操作基于此)

使用isEqual对所讨论的键实现键的相等。因此,{1,3,5}和{3,5,1}的比较(假设数字由NSNUmber实例表示)将是肯定的。

是的,它似乎工作得很好(不确定是否存在任何陷阱)

产出:

2009-12-08 15:42:17.885 x[4989] (d, e, b, c) : 2
2009-12-08 15:42:17.887 x[4989] (d, a, b, c) : 1
2009-12-08 15:42:17.887 x[4989] set: (d, e, b, c) : key: 2

是(因为集合符合NSCopying并实现了
isEqual:
),有一个问题:不要使用可变集合或任何其他可变对象作为键。您将对其进行变异,从而破坏您在字典中查找其值的能力。

这一点,
NSSet
符合
NSCopying
,这是
NSDictionary
键的另一个要求。+1:唯一的另一个警告是,如果您想使用键值编码访问/修改字典的键,那么字典的键必须是字符串;键必须是不可变的,因此对键调用
copy
。因此,当用作键时,任何
NSMutableSet
都将复制到新的
NSSet
中。键是不可变的,这就是我使用NSSet的原因。
2009-12-08 15:42:17.885 x[4989] (d, e, b, c) : 2
2009-12-08 15:42:17.887 x[4989] (d, a, b, c) : 1
2009-12-08 15:42:17.887 x[4989] set: (d, e, b, c) : key: 2