Когда использовать множество (Set) в Swift?

Ответ

Множество (Set) в Swift используется для хранения неупорядоченной коллекции уникальных элементов одного типа, соответствующего протоколу Hashable.

Основные сценарии применения:

  • Гарантия уникальности элементов. Автоматическое удаление дубликатов при вставке.
    let uniqueIDs: Set = [101, 102, 103, 101] // Станет [101, 102, 103]
  • Быстрая проверка принадлежности. Метод contains(_:) работает в среднем за O(1).
    if uniqueIDs.contains(102) { // Быстрая проверка
        print("ID найден")
    }
  • Выполнение теоретико-множественных операций: объединение (union), пересечение (intersection), вычитание (subtracting), симметрическая разность (symmetricDifference).
    let admins: Set = ["Alice", "Bob"]
    let activeUsers: Set = ["Bob", "Charlie"]
    let activeAdmins = admins.intersection(activeUsers) // ["Bob"]

Когда НЕ использовать Set:

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

Совет: Для хранения упорядоченных уникальных элементов рассмотрите использование NSOrderedSet (Foundation) или комбинации Set для проверки уникальности и Array для сохранения порядка.

Ответ 18+ 🔞

Смотри, вот тебе про множества в Swift, а то некоторые их как будто впервые видят, блядь.

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

Зачем это, спросишь? А вот зачем, ёпта:

  • Чтобы не было повторов, нахуй. Засунул туда одни и те же цифры — дубликаты сами сотрутся, как нехуй делать.
    let ids: Set = [777, 666, 777, 888] // В итоге останется [777, 666, 888], и порядок хрен знает какой.
  • Молниеносно проверить, есть ли элемент. Метод contains(_:) работает так быстро, что глазами не моргнешь, в среднем за O(1). Не то что в массиве, где надо всё перебирать, ебать его в сраку.
    if ids.contains(666) { // Щёлк — и готово
        print("Нашёл, пидарас!")
    }
  • Делать крутые штуки с множествами, как на математике: сложить два набора (union), найти общее (intersection), убрать одно из другого (subtracting), или найти что уникально в каждом (symmetricDifference).
    let модераторы: Set = ["Васян", "Петрович"]
    let онлайн: Set = ["Петрович", "Колян"]
    let онлайн_модеры = модераторы.intersection(онлайн) // ["Петрович"], естественно

А вот когда НЕ надо его использовать, чтобы не выглядеть как манда с ушами:

  • Если тебе важен порядок (бери Array, не мудри).
  • Если тебе нужны дубликаты (опять же, массив, блядь).
  • Если ты постоянно лезешь к элементам по индексу, типа [5] (в сете индексов нет, потому что порядок — хуйня).

Лайфхак на посошок: Если тебе вдруг приспичило хранить уникальные элементы, но ещё и в порядке добавления — это пиздец, конечно, задача. Можно посмотреть в сторону NSOrderedSet из Foundation, либо городить велосипед из Set для проверки уникальности и Array для порядка. Но это уже на твоей совести, ебать.