> Что такое Set, его особенности, зачем нужен и какие есть реализации (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Тинькофф

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Set - это неупорядоченная коллекция уникальных элементов в Swift. Главные особенности: каждый элемент встречается только один раз, порядок не гарантирован, доступ к элементам выполняется по значению, а не по индексу. Используется для быстрой проверки принадлежности элемента, удаления дубликатов и выполнения операций над множествами (объединение, пересечение, разность). Реализован на основе хеш-таблицы, поэтому операции вставки, удаления и поиска имеют среднюю сложность O(1).

Подробное объяснение

Set в Swift - это коллекция, которая хранит уникальные значения одного типа. Он подходит, когда важен факт наличия элемента, а не его позиция или количество. Основные характеристики:

  • элементы не имеют порядка - при итерации порядок может отличаться от порядка добавления;
  • все элементы уникальны - попытка добавить дубликат игнорируется;
  • тип элемента должен соответствовать протоколу Hashable - это необходимо для хеширования и быстрого поиска;
  • внутренняя реализация - хеш-таблица, поэтому операции вставки, удаления и поиска выполняются за O(1) в среднем случае.

Зачем нужен Set:

  • проверка принадлежности элемента - contains(_:) работает значительно быстрее, чем в массиве;
  • удаление дубликатов из последовательности - можно преобразовать массив в Set и обратно;
  • операции над множествами - union, intersection, subtracting, symmetricDifference для решения задач, связанных с группами данных;
  • хранение уникальных идентификаторов, тегов, ключей.

Реализации в стандартной библиотеке Swift:

  • Set<Element> - основная структура, значение-тип (value type);
  • NSOrderedSet и NSMutableOrderedSet - из Foundation, сохраняют порядок добавления, но работают с объектами и имеют другую семантику;
  • SetAlgebra - протокол, который описывает операции над множествами, его реализуют Set, OptionSet и другие.

На практике

Set удобен в мобильной разработке для:

  • хранения выбранных элементов (например, id выбранных товаров) без дубликатов;
  • быстрой проверки, есть ли объект в списке (например, в избранном);
  • фильтрации уникальных значений из массива;
  • реализации логики "общие друзья", "пересечение интересов" и т.п.

Важно помнить: Set не гарантирует порядок, поэтому если порядок критичен, нужно использовать массив или NSOrderedSet.

Пример кода

SWIFT
// Создание Set
var fruits: Set<String> = ["apple", "banana", "orange"]
// Добавление дубликата - не изменит Set
fruits.insert("apple")
print(fruits.count) // 3
// Проверка принадлежности
if fruits.contains("banana") {
print("banana есть")
}
// Удаление дубликатов из массива
let numbers = [1, 2, 3, 2, 1, 4]
let uniqueNumbers = Set(numbers) // {1, 2, 3, 4}
// Операции над множествами
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5, 6]
let union = a.union(b) // {1, 2, 3, 4, 5, 6}
let intersection = a.intersection(b) // {3, 4}
let difference = a.subtracting(b) // {1, 2}

Как отвечать на собеседовании

Начни с определения: Set - это неупорядоченная коллекция уникальных элементов. Затем перечисли ключевые особенности: уникальность, отсутствие порядка, требование Hashable, быстрый поиск. Объясни, зачем он нужен: проверка принадлежности, удаление дубликатов, операции над множествами. Упомяни, что реализация основана на хеш-таблице, поэтому сложность операций O(1). Если спросят про альтернативы, скажи про NSOrderedSet, когда нужен порядок, и про OptionSet для битовых флагов.

Что проверяет интервьюер

Интервьюер проверяет:

  • понимание базовых коллекций Swift и их отличий;
  • знание протокола Hashable и его роли;
  • понимание сложности операций и внутренней реализации;
  • умение выбрать подходящую коллекцию под задачу;
  • знание операций над множествами и их практического применения.

Типичные ошибки

  • утверждение, что Set сохраняет порядок добавления - это не так;
  • попытка обратиться к элементу по индексу - в Set нет индексов;
  • использование Set для типов, не реализующих Hashable - приведет к ошибке компиляции;
  • ожидание, что insert вернет ошибку при дубликате - метод просто ничего не меняет;
  • игнорирование того, что Set - value type, и при передаче в функцию копируется;
  • путаница между Set и NSSet - в Swift предпочтительнее Set, так как он типобезопасный и работает со структурами.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью