Это неправильно, и не имеет смысла, что компилятор синтезирует его автоматически:
static func == (lhs: Player, rhs: Player) -> Bool {
return lhs.hashValue == rhs.hashValue
}
Идентичные объекты должны иметь одинаковое значение хеш-функции, но не наоборот: Отдельные объекты может иметь одно и то же значение хеш-функции.
Конкретно, в вашем примере: имя является строкой и существует бесконечно много разных строк, но только 2 64 разных значений хеш-функции.Таким образом, должно быть две разные строки с одинаковым значением хеш-функции.
Если все сохраненные свойства Hashable
, то компилятор может полностью синтезировать соответствие для вас.Например,
struct Player : Equatable, Hashable {
let name: String
var score: Int
}
Здесь два игрока «идентичны», если у них одинаковое имя и одинаковый счет.
Если есть свойства, которые не могут быть изменены, или если вы хотите настроитьконцепция идентичности, то вы должны переопределить ==
и hash(into)
соответственно.Хэш-функция должна использовать те же свойства, которые определяют идентичность в ==
.Например,
struct Player : Equatable, Hashable {
let name: String
var score: Int
static func == (lhs: Player, rhs: Player) -> Bool {
return lhs.name == rhs.name
}
func hash(into hasher: inout Hasher) {
hasher.combine(self.name)
}
}
Теперь два игрока «идентичны», если у них одинаковое имя.