Почему NSSet использует allObjects, в то время как NSOrderedSet просто использует массив?
Мне действительно очень любопытно, что я собираюсь позвонить 912
Если я хочу преобразовать массив в массив в NSSet, я использую allObjects.
Если я хочу преобразовать массив в NSOrderedSet, я использую массив.
Genius.
Любой психиатр здесь знает, что у инженера Apple по поводу того, почему они решили его спроектировать?
Ответы
Ответ 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, возвращаемый "массивом", является прокси-объектом объектов в наборе.
Таким образом, если вы измените значение любого объекта в наборе, вы измените значение объекта в массиве. Копия заказанного набора не производится. Таким образом, у двух свойств есть разные имена, потому что они делают разные вещи.