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

Почему NSSet использует allObjects, в то время как NSOrderedSet просто использует массив?

Мне действительно очень любопытно, что я собираюсь позвонить 912

Если я хочу преобразовать массив в массив в NSSet, я использую allObjects.

Если я хочу преобразовать массив в NSOrderedSet, я использую массив.

Genius.

Любой психиатр здесь знает, что у инженера Apple по поводу того, почему они решили его спроектировать?

4b9b3361

Ответ 1

Спекуляция, но:

Потому что, когда NSSet был создан, единственным другим основным типом коллекции был NSArray, который был (и по-прежнему является, в основном) наиболее распространенным типом коллекции. Таким образом, метод под названием "allObjects", очевидно, вернет NSArray.

Когда NSOrderedSet был добавлен совсем недавно, ему пришлось иметь дело с существованием предыдущих коллекций - в первую очередь NSArray и NSSet. Таким образом, метод "allObjects" будет неоднозначным. Ergo имеет два метода: -array и -set.

И/или методы -array и -set возвращают прокси-серверы, которые, вероятно, являются теми же или похожими классами, которые используются внутри. Таким образом, в функциональном смысле они немного отличаются друг от друга - эти прокси будут видеть мутации, сделанные на исходном NSOrderedSet. -allObjects, с другой стороны, не создает - он действительно создает независимый массив, поскольку его внутреннее хранилище, скорее всего, является хэш-таблицей или схожей, которая не легко проксирована.

Ответ 2

Пока существуют и другие различия, .allObjects не подразумевает определенного упорядочения, а .array делает; и это именно то, что вы получаете.


.array возвращает живой прокси базового NSOrderedSet, и если базовый упорядоченный набор изменяется, прокси будет меняться вместе с ним.

Ответ 3

Также... NSArray, возвращаемый 'allObjects', является копией значений в наборе.

Но NSArray, возвращаемый "массивом", является прокси-объектом объектов в наборе.

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