Подтвердить что ты не робот

Почему [NSDictionary allKeys] возвращает набор?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Просто дикие спекуляции, конечно.; -)

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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