NSSet и NSCountedSet, когда наилучшее время должно использовать их?

Почему бы не позволить библиотеке проверить ее для вас? Не следует вводить сложные регулярные выражения, которые невозможно поддерживать.

% gem install ipaddress

Затем в вашем приложении

require "ipaddress"

IPAddress.valid? "192.128.0.12"
#=> true

IPAddress.valid? "192.128.0.260"
#=> false

# Validate IPv6 addresses without additional work.
IPAddress.valid? "ff02::1"
#=> true

IPAddress.valid? "ff02::ff::1"
#=> false


IPAddress.valid_ipv4? "192.128.0.12"
#=> true

IPAddress.valid_ipv6? "192.128.0.12"
#=> false

Вы также можете использовать встроенный в Ruby класс IPAddr, но он не очень хорошо подходит для проверки.

Конечно, если IP-адрес предоставляется вам сервером приложений или инфраструктурой, нет никаких оснований для проверки вообще. Просто используйте предоставленную вам информацию и изящно обработайте любые исключения.

9
задан jszumski 27 April 2013 в 17:12
поделиться

3 ответа

NSSet используется, когда вы часто хотите проверить членство объекта, но не заботитесь о порядке и не нуждаетесь в коллекции для содержат повторяющиеся объекты. NSSet не хранит свои объекты в каком-либо определенном порядке; скорее, класс специально разработан для эффективной проверки того, существует ли объект в коллекции.

То же самое касается NSCountedSet , хотя NSCountedSet также сохраняет подсчитать дублированных объектов.

Итак, в двух словах: используйте набор, когда вы беспокоитесь о тестировании на членство , а не просто храните коллекцию объектов (некоторые из которых могут быть дублированным, как было решено каким-то методом isEqualTo ).

14
ответ дан 4 December 2019 в 07:35
поделиться

В дополнение к другим ответам, которые говорят в основном о наборах, но не столько о подсчитываемых наборах, вы можете задаться вопросом, когда лучше всего использовать счетный набор. Подсчитываемый набор полезен для таких вещей, как взвешивание или другие статистические алгоритмы: в конце вы можете в конечном итоге создать упорядоченный массив его содержимого, отсортированный с использованием сохраненного счетчика.

Другой вариант - это уникальные таблицы или форма ссылки счетчик / сборщик мусора. Использование подсчитываемого набора позволит включить тесты (т. Е. Вернуть существующий идентичный объект, а не создавать новый - аналогично тому, что CoreData делает внутри), одновременно выполняя своего рода подсчет ссылок на значения, которые он включает, поскольку объект будет только освобождается набором, когда его счетчик достигает 0.

4
ответ дан 4 December 2019 в 07:35
поделиться

Вслед за midpadi, многие виды использования NSArray следует заменить на NSSet. NSSet - это набор уникальных объектов. NSArray - это набор упорядоченных объектов. Если ваши объекты не имеют внутреннего порядка и уникальны, вам следует использовать NSSet.

Я очень часто сохраняю NSSet на уровне модели и позволяю компонентам пользовательского интерфейса, которым требуется порядок, создавать свои собственные массивы NSArrays. Например, рассмотрим случай со «списком друзей», состоящим из «приятелей». Сам список друзей неупорядочен; это просто коллекция. И объекты должны быть уникальными. Однако на уровне пользовательского интерфейса вам нужен порядок, и вы можете даже захотеть поместить одного и того же собеседника в несколько групп (например, «Избранное» и «Не в сети»). Но это проблемы пользовательского интерфейса, и слой модели не должен о них беспокоиться.

NSSet *buddies = [buddyList allBuddies];
BOOL isBuddy = [buddyList containsObject:buddy];

NSArray *buddyList = [[buddyList allBuddies] sortedAraryUsingSelector:[self buddySortSelector]];

Когда появляется новый приятель, BuddyList отправит уведомление ( BuddyListDidAddBuddiesNotification ), которое включает NSSet добавленных друзей в его userInfo. Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.

Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.

Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.

который включает NSSet добавленных друзей в свой userInfo. Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.

Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.

Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.

который включает NSSet добавленных друзей в свой userInfo. Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.

Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.

Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.

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

Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.

Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.

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

Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.

Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.

Достаточно легко выяснить различия между ними и построить серию удалений и добавлений, чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.

Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.

Достаточно легко выяснить различия между ними и построить серию удалений и добавлений, чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.

Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.

11
ответ дан 4 December 2019 в 07:35
поделиться