Какие ограничения на типы данных существуют для Set в Swift?

«Какие ограничения на типы данных существуют для Set в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Почему Hashable?

  1. Уникальность: Для проверки, содержит ли коллекция элемент, Set сравнивает его хеш-значение.
  2. Производительность: Хеширование позволяет избежать линейного поиска.

Примеры:

// Встроенные Hashable-типы работают сразу
let numberSet: Set<Int> = [1, 2, 3]
let stringSet: Set<String> = ["A", "B", "C"]

// Пользовательский тип требует соответствия Hashable
struct Point: Hashable {
    let x: Int
    let y: Int
}
let pointSet: Set<Point> = [Point(x: 0, y: 0)]

// Тип без Hashable вызовет ошибку компиляции
// struct NonHashableType { }
// let invalidSet: Set<NonHashableType> = [] // Ошибка

Best Practice: Для пользовательских типов, все свойства которых уже Hashable, компилятор Swift может автоматически сгенерировать реализацию протокола. В противном случае её нужно предоставить вручную, реализовав метод hash(into:) и оператор ==.