Ответ
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.