これは誤りであり、コンパイラが自動的に合成しても意味がありません。
static func == (lhs: Player, rhs: Player) -> Bool {
return lhs.hashValue == rhs.hashValue
}
同一のオブジェクトは同じハッシュ値を持つ必要がありますが、その逆ではありません。異なるオブジェクトは同じハッシュ値を持つことができます。
具体的には、あなたの例では:名前は文字列であり、無限に多くの異なる文字列がありますが、2 64の異なるハッシュ値しかありません。したがって、同じハッシュ値を持つ 2 つの異なる文字列が存在する必要があります。
すべての格納されたプロパティがあればHashable、コンパイラは適合性を完全に合成できます。例えば
struct Player : Equatable, Hashable {
let name: String
var score: Int
}
ここで、2 人のプレイヤーは、名前とスコアが同じであれば「同一」です。
ハッシュできないプロパティがある場合、または ID の概念をカスタマイズする場合は、それに応じてオーバーライドする必要があり== ます hash(into)。ハッシュ関数は、 で ID を決定するのと同じプロパティを使用する必要があります==。例えば
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)
}
}
2 人のプレイヤーが同じ名前の場合、「同一」になります。