Ответ
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, там такое есть.