我知道你可以使用任何对象作为NSDictionary的键,但问题是它能否检索到正确的值?支持我有一个条目,其中key = {1,3,5}和value = {@“hello”}。我能通过传递集合{3,5,1}从这个字典条目中检索吗?
顺序来说,键是基于指针匹配还是实际比较集的内容? (如果是前者,我怎么能克服这个?)
答案 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基于它的行为时)