Может ли NSDictionary взять NSSet в качестве ключа? - PullRequest
3 голосов
/ 08 декабря 2009

Я знаю, что вы можете использовать любой объект в качестве ключа для NSDictionary, но проблема в том, сможет ли он получить правильное значение? Поддержка У меня есть запись, где ключ = {1,3,5} и значение = {@ "привет"}. Смогу ли я получить из этой словарной статьи, передав набор {3,5,1}?

Другими словами, соответствует ли ключ на основе указателя или фактически сравнивает содержимое набора? (И если это первое, как я могу преодолеть это?)

Ответы [ 4 ]

6 голосов
/ 08 декабря 2009

Равенство ключей осуществляется с помощью isEqual для рассматриваемых ключей. Таким образом, сравнение {1,3,5} и {3,5,1} (при условии, что числа представлены экземплярами NSNUmber) будет ДА.

3 голосов
/ 08 декабря 2009

Да, похоже, он работает хорошо (не уверен, есть ли какие-то ошибки).

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
1 голос
/ 08 декабря 2009

Да (поскольку набор соответствует NSCopying и реализует isEqual:), с одним уловом: Не использовать изменяемый набор или любой другой изменяемый объект в качестве ключа. Вы будете видоизменять его, после чего вы лишите себя возможности искать его значение в словаре.

0 голосов
/ 08 декабря 2009

Да.

Попробуйте это в 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 значение true, когда вы ожидаете, что это так и NSDictionary основывает свои действия на этом)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...