Что необходимо, чтобы использовать структуру (struct) в качестве ключа словаря в Swift?

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

Ответ

Чтобы тип мог быть ключом в Dictionary, он должен соответствовать протоколу Hashable. Для структуры это означает:

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

Пример ручной реализации:

struct Coordinate: Hashable {
    let latitude: Double
    let longitude: Double

    // 1. Реализация hash(into:)
    func hash(into hasher: inout Hasher) {
        hasher.combine(latitude)
        hasher.combine(longitude)
    }

    // 2. Реализация Equatable
    static func == (lhs: Coordinate, rhs: Coordinate) -> Bool {
        return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude
    }
}

// Использование в качестве ключа
var cache: [Coordinate: String] = [:
cache[Coordinate(latitude: 55.75, longitude: 37.61)] = "Москва"

Важно: Swift поддерживает автоматический синтез соответствия протоколам Hashable и Equatable, если все свойства структуры также им соответствуют. В этом случае явно реализовывать методы не нужно.