Equatable은 두 인스턴스가 같은지 비교할 수 있도록 하는 프로토콜이고, Hashable은 객체를 해시값으로 변환할 수 있도록 하는 프로토콜입니다. Hashable은 Equatable을 상속하기 때문에 Hashable을 채택하면 반드시 == 비교를 구현해야 합니다. Equatable은 == 연산을 구현해 값의 동등성을 판단하고, Hashable은 이를 기반으로 hash(into:)를 구현해 Dictionary의 키나 Set의 원소처럼 빠른 검색과 저장이 가능하게 합니다.
추가로 확인해보니 Hashable을 채택한 구조체에서 프로퍼티가 모두 Hashable이라면 == 비교와 hash(into:)를 자동으로 만들어줍니다.
struct MyItem: Hashable {
let id: Int
let title: String
static func == (lhs: MyItem, rhs: MyItem) -> Bool {
return lhs.id == rhs.id // id가 같으면 같은 객체로 본다
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}