Какие требования предъявляются к типу элементов множества (Set) в Swift?

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

Ответ

Тип элементов множества (Set<Element>) должен соответствовать протоколу Hashable.

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

  1. Вычислять целочисленный хеш (hash(into:)).
  2. Проверять равенство (==), так как Hashable наследуется от Equatable.

Примеры допустимых типов:

// Все стандартные типы (Int, String, Bool, Double и т.д.) уже Hashable.
let intSet: Set<Int> = [1, 2, 3]
let stringSet: Set<String> = ["apple", "banana"]

// Для пользовательских типов необходимо явно подписать протокол.
struct Coordinate: Hashable {
    let x: Int
    let y: Int
    // Компилятор автоматически синтезирует реализацию,
    // так как все свойства (Int) тоже Hashable.
}
let coordSet: Set<Coordinate> = [Coordinate(x: 0, y: 0)]

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