Почему [NSDictionary allKeys] не возвращает набор? - PullRequest
19 голосов
/ 14 января 2011

Есть ли причина для NSDictionary вернуть свои ключи как NSArray вместо NSSet?В документации уже говорится, что порядок ключей в массиве не определен, было бы логично использовать набор.

Ответы [ 5 ]

2 голосов
/ 15 января 2011

Наборы, как правило, несколько игнорируются в дизайне API.Они будут включаться большую часть времени, но обычно намного позже всех других стандартных структур данных.Добавьте к этому тот факт, что, кроме самого недавнего NSFastEnumeration, в Objective-C нет общего протокола коллекции или последовательности - каждый класс коллекции полностью независим от всех остальных - и становится очень трудно переключаться на наборы после APIуже написано, что возвращает массивы.

1 голос
/ 14 января 2011

My думаю, заключается в том, что Apple использует NSArray повсеместно (и большинство программистов в том числе), поэтому этот выбор естественен - ​​и его изменение сейчас обойдется дорого. И , если использует внутренние массивы, копия неизменяемого массива намного дешевле, чем создание набора только для математической элегантности.

Также обратите внимание, что NSSet и NSArray не имеют общего родителя (ну, конечно, за исключением NSObject), поэтому абстрагирование этого интерфейса также невозможно (за исключением возврата чего-то, соответствующего NSFastEnumeration ).

Просто дикие домыслы, конечно. ; -)

0 голосов
/ 23 января 2016

Обычно вы хотите что-то сделать с ключами, и в этом случае проще использовать этот метод NSDictionary:

- (NSSet<KeyType> *)keysOfEntriesPassingTest:(BOOL (^)(KeyType key, ObjectType obj, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0);

Это экономит время, потому что теперь вам не нужно фильтровать массив, используяпредикат, вы можете просто выполнить свой тест здесь, и вы получите обратно.Простой.

Кроме того, вы можете воспользоваться многопроцессорным параллелизмом, передав опцию параллельного перечисления этой версии метода:

- (NSSet<KeyType> *)keysOfEntriesWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(KeyType key, ObjectType obj, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0);
0 голосов
/ 22 октября 2014

использовать использовать c ++, std :: map предоставляет доступ к своим ключам в виде набора.возвращенный набор является даже «живым», набор отражает текущий текущий набор ключей.конечно, вы также можете сделать копию.

0 голосов
/ 14 января 2011

Я предполагаю, что, поскольку -allKeys возвращает копию ключей (это не поддерживается словарем), то создание NSSet требует много времени (создание дерева или хеш-таблицы) или что-то еще) по сравнению с простым сбросом ключей в плоский массив.

...