Что такое Set в Swift и каковы его ключевые характеристики?

Ответ

Set — это тип коллекции в Swift, который хранит уникальные значения одного типа в неупорядоченном виде. Реализован как хэш-таблица, что обеспечивает высокоэффективный поиск.

Основные характеристики:

  • Уникальность: Все элементы должны быть уникальными (дубликаты игнорируются при вставке).
  • Неупорядоченность: Порядок элементов не гарантируется и может меняться.
  • Тип элемента: Должен соответствовать протоколу Hashable. Это требование является ключом для обеспечения уникальности и быстрого доступа.
  • Производительность: Операции contains(_:), insert(_:), remove(_:) в среднем выполняются за O(1) (константное время).

Базовые операции:

// Инициализация
var activeUserIDs: Set<Int> = [101, 102, 103]
var favoriteFruits: Set = ["Apple", "Orange", "Mango"] // Вывод типа

// Проверка наличия элемента (быстрая операция O(1))
if favoriteFruits.contains("Apple") {
    print("Apple is in the set!")
}

// Добавление элемента. Возвращает кортеж (inserted: Bool, memberAfterInsert: Element)
let (inserted, _) = favoriteFruits.insert("Banana")
if inserted {
    print("Banana was added.")
}
let (notInserted, _) = favoriteFruits.insert("Apple") // notInserted = false

// Удаление элемента
let removedFruit = favoriteFruits.remove("Orange") // Возвращает удаленный элемент или nil
favoriteFruits.removeAll() // Очистка сета

Теоретико-множественные операции (возвращают новый Set):

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let primeDigits: Set = [2, 3, 5, 7]

// Объединение (union)
let allDigits = oddDigits.union(evenDigits) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

// Пересечение (intersection)
let oddPrimes = oddDigits.intersection(primeDigits) // [3, 5, 7]

// Симметрическая разность (symmetricDifference) - элементы, которые есть только в одном из множеств
let nonOverlapping = oddDigits.symmetricDifference(primeDigits) // [1, 2, 9]

// Вычитание (subtracting)
let notPrimeOdds = oddDigits.subtracting(primeDigits) // [1, 9]

Отношения между множествами:

let smallSet: Set = [1, 2]
let largeSet: Set = [1, 2, 3, 4]

print(smallSet.isSubset(of: largeSet))       // true
print(largeSet.isSuperset(of: smallSet))     // true
print(smallSet.isStrictSubset(of: largeSet)) // true (не равны)
print(smallSet.isDisjoint(with: [5, 6]))     // true (нет общих элементов)

Типичные случаи использования Set:

  • Удаление дубликатов из массива: let uniqueArray = Array(Set(duplicateArray)) (порядок потеряется).
  • Проверка членства: Быстрая проверка, содержится ли элемент в коллекции (например, список запрещенных слов, кэш).
  • Математические операции: Работа с логическими группами (теги, категории, права доступа).
  • Сравнение коллекций: Проверка на равенство без учета порядка.

Важно: Если порядок элементов критичен, используйте Array. Если нужен уникальный порядок, рассмотрите OrderedSet из Swift Collections.

Ответ 18+ 🔞

А, смотри-ка, про Set в Swift! Ну это ж, блядь, такая коллекция, которая хранит уникальные значения одного типа, но вразброс, как попало. Внутри там хэш-таблица, поэтому искать в ней — одно удовольствие, быстро, блядь.

Что за зверь такой:

  • Уникальность: Все элементы там — как отпечатки пальцев, одинаковых не бывает. Если сунешь дубликат, он его проигнорит, нахуй.
  • Беспорядок: Порядок элементов — хуй его знает, может меняться, как ему вздумается.
  • Тип элемента: Должен соответствовать протоколу Hashable. Это, блядь, ключевое требование, чтобы уникальность и быстрый доступ работали.
  • Скорость: Операции типа contains(_:), insert(_:), remove(_:) в среднем выполняются за O(1), то есть почти мгновенно, ёпта.

Базовые телодвижения:

// Создаём
var activeUserIDs: Set<Int> = [101, 102, 103]
var favoriteFruits: Set = ["Apple", "Orange", "Mango"] // Тип сам догадается

// Проверяем, есть ли элемент (быстро, O(1), не то что в массиве!)
if favoriteFruits.contains("Apple") {
    print("Яблоко-то есть, блядь!")
}

// Добавляем элемент. Возвращает кортеж (inserted: Bool, memberAfterInsert: Element)
let (inserted, _) = favoriteFruits.insert("Banana")
if inserted {
    print("Бананчик добавили.")
}
let (notInserted, _) = favoriteFruits.insert("Apple") // notInserted = false, яблоко уже было

// Удаляем элемент
let removedFruit = favoriteFruits.remove("Orange") // Вернёт удалённый элемент или nil
favoriteFruits.removeAll() // Очищаем всё, пиздец

Математика, блядь, множества (возвращают новый Set):

let oddDigits: Set = [1, 3, 5, 7, 9] // Нечётные
let evenDigits: Set = [0, 2, 4, 6, 8] // Чётные
let primeDigits: Set = [2, 3, 5, 7] // Простые

// Объединение (union) — всё в кучу
let allDigits = oddDigits.union(evenDigits) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

// Пересечение (intersection) — что общего
let oddPrimes = oddDigits.intersection(primeDigits) // [3, 5, 7]

// Симметрическая разность (symmetricDifference) — что есть только в одном, но не в обоих
let nonOverlapping = oddDigits.symmetricDifference(primeDigits) // [1, 2, 9]

// Вычитание (subtracting) — убрать из одного то, что есть в другом
let notPrimeOdds = oddDigits.subtracting(primeDigits) // [1, 9]

Кто кому сват, брат и кум:

let smallSet: Set = [1, 2]
let largeSet: Set = [1, 2, 3, 4]

print(smallSet.isSubset(of: largeSet))       // true, маленький внутри большого
print(largeSet.isSuperset(of: smallSet))     // true, большой содержит маленький
print(smallSet.isStrictSubset(of: largeSet)) // true (и при этом они не равны)
print(smallSet.isDisjoint(with: [5, 6]))     // true (вообще нет общих элементов, живут отдельно)

Где эту хуйню применять:

  • Удаление дубликатов из массива: let uniqueArray = Array(Set(duplicateArray)) (правда, порядок, блядь, потеряется — имей в виду).
  • Быстрая проверка «а есть ли чёрт?»: Например, список запрещённых слов, кэш — идеально.
  • Математические операции с группами: Теги, категории, права доступа — то, что надо.
  • Сравнение коллекций без оглядки на порядок: Проверить, одинаковые ли наборы элементов.

Важный момент, ёпта: Если тебе порядок элементов важен, как жизнь — используй Array. А если нужна уникальность, но с порядком — глянь в сторону OrderedSet из Swift Collections, там такое есть.