NSDictionary可以将NSSet作为密钥吗?

时间:2009-12-07 21:34:22

标签: iphone objective-c cocoa cocoa-touch

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

顺序来说,键是基于指针匹配还是实际比较集的内容? (如果是前者,我怎么能克服这个?)

4 个答案:

答案 0 :(得分:6)

使用相关键上的isEqual完成键的相等性。因此,{1,3,5}和{3,5,1}的比较(假设数字由NSNUmber实例表示)将为YES。

答案 1 :(得分:3)

是的,它看起来效果很好(不确定是否有任何问题)。

NSMutableDictionary * dict = [NSMutableDictionary dictionary];

NSSet * set;
set = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil];
[dict setObject:@"1" forKey:set];

set = [NSSet setWithObjects:@"b", @"c", @"d", @"e", nil];
[dict setObject:@"2" forKey:set];

id key;
NSEnumerator * enumerator = [dict keyEnumerator];
while ((key = [enumerator nextObject]))
    NSLog(@"%@ : %@", key, [dict objectForKey:key]);

set = [NSSet setWithObjects:@"c", @"b", @"e", @"d", nil];
NSString * value = [dict objectForKey:set];
NSLog(@"set: %@ : key: %@", set, value);

输出:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在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:对于NSSet是正确的,当你期望它和NSDictionary基于它的行为时)