Массив из набора: почему 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, возвращаемый массивом, является прокси объектов в наборе.

Таким образом, если вы измените значение любого объекта в наборе, вы измените значение объекта в массиве. Копия заказанного набора не производится. Таким образом, два свойства имеют разные имена, потому что они делают разные вещи.

Другие вопросы по тегам