Есть ли причина для NSDictionary
вернуть свои ключи как NSArray
вместо NSSet
? В документации уже указано, что порядок ключей в массиве undefined, было бы логичным использовать набор.
Почему [NSDictionary allKeys] возвращает набор?
Ответ 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 обеспечивает доступ к своим ключам в качестве набора. возвращенный набор даже "живой", набор отражает текущий текущий набор ключей. конечно, вы также можете сделать копию.