Ответ
Тип значения должен соответствовать протоколу Hashable.
Объяснение: Hashable является обязательным, потому что Set:
- Гарантирует уникальность элементов (не может содержать дубликатов).
- Обеспечивает высокоэффективный (в среднем 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
}
}