딕셔너리에서 커스텀 타입으로 key를 쓰려면 Hashable 프로토콜을 사용해야한다. 이 프로토콜은 Equatable 프로토콜을 상속하며 Equatable에 대한 요구조건도 만족해야한다.
Hashable을 상속한다고 선언하는 것만으로도 충분한 때가 있다. 컴파일러에서 자동으로 Hashable의 요구사항을 따르도록 해주는 경우인데, 이는 다음과 같은 경우이다.
위 경우가 아닌 커스텀한 타입이 Hashable을 따르게 하려면, hash(into:) 메소드를 구현한다. hash(into:) 내에서는 커스텀 타입의 프라퍼티를 제공된 hasher의 combine(_:)함수의 파라미터로 전달해주면 된다. == 연산자를 사용하기 위해 제공된 프라퍼티에 쓰인 것과 같다.
// A point in an x-y coordinate system.
struct GridPoint {
var x: Int
var y: Int
}
extension GridPoint: Hashable {
static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
func hash(into hasher: inout Hasher) {
hasher.combine(x)
hasher.combine(y)
}
}