Какое требование к типу значения для его хранения в Set?

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

Ответ

Тип значения должен соответствовать протоколу Hashable.

Объяснение: Hashable является обязательным, потому что Set:

  1. Гарантирует уникальность элементов (не может содержать дубликатов).
  2. Обеспечивает высокоэффективный (в среднем O(1)) поиск, вставку и удаление.

Эти операции реализованы на основе хеш-таблицы, которая требует от типа:

  • Возможности генерировать целочисленный хеш-код (метод hash(into:)).
  • Возможности проверять равенство экземпляров (метод ==), так как Hashable наследуется от Equatable.

Пример с пользовательским типом:

// Компилятор автоматически создаст реализацию Hashable,
// если все свойства типа уже соответствуют Hashable.
struct Product: Hashable {
    let sku: String // String is Hashable
    let price: Int  // Int is Hashable
}

let productSet: Set<Product> = [
    Product(sku: "123", price: 999),
    Product(sku: "456", price: 1499)
]

// Для типов с не-Hashable свойствами или
// кастомной логикой равенства требуется ручная реализация.
class User: Hashable {
    let id: UUID
    var name: String

    init(id: UUID, name: String) { self.id = id; self.name = name }

    static func == (lhs: User, rhs: User) -> Bool {
        return lhs.id == rhs.id
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(id) // Хешируем только стабильный, уникальный id
    }
}