Ответ
Чтобы тип мог быть ключом в Dictionary, он должен соответствовать протоколу Hashable. Для структуры это означает:
- Реализовать
Hashable: Протокол требует реализации методаhash(into:), который объединяет хэши всех значимых для равенства свойств. - Реализовать
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, если все свойства структуры также им соответствуют. В этом случае явно реализовывать методы не нужно.