Массив из набора: почему NSSet использует allObjects, а NSOrderedSet использует массив?
В Foundation, если я хочу преобразовать набор в NSArray
, Я могу использовать:
-[NSSet allObjects]
-[NSOrderedSet array]
Почему они разные?
3 ответа
Спекуляция, но:
Потому что, когда был создан NSSet, единственным другим основным типом коллекции был NSArray, который был (и остается в значительной степени) наиболее распространенным типом коллекции. Таким образом, метод с именем "allObjects", очевидно, вернет NSArray.
Когда NSOrderedSet был добавлен гораздо позже, ему пришлось иметь дело с существованием предыдущих коллекций - прежде всего, NSArray и NSSet. Таким образом, метод "allObjects" будет неоднозначным. Следовательно, у него есть два метода: -array и -set.
И / или методы -array и -set возвращают прокси для того, что, вероятно, является тем же или аналогичным классом, используемым внутри. Так что в функциональном смысле они немного отличаются - эти прокси увидят мутации, сделанные в оригинальном NSOrderedSet. -allObjects с другой стороны - нет - он действительно создает независимый массив, поскольку его внутреннее хранилище, скорее всего, является хеш-таблицей или чем-то подобным, что не является готовым прокси.
Хотя есть и другие различия †, .allObjects
не подразумевает определенного порядка, и .array
делает; и это именно то, что вы получаете.
† .array
возвращает живой прокси базового NSOrderedSet
и если базовый упорядоченный набор изменится, прокси изменится вместе с ним.
Также... NSArray, возвращаемый 'allObjects', является копией значений в наборе.
Но NSArray, возвращаемый массивом, является прокси объектов в наборе.
Таким образом, если вы измените значение любого объекта в наборе, вы измените значение объекта в массиве. Копия заказанного набора не производится. Таким образом, два свойства имеют разные имена, потому что они делают разные вещи.