Hashable 프로토콜

raindrop·2023년 3월 16일
0
post-custom-banner

쓰임새

딕셔너리에서 커스텀 타입으로 key를 쓰려면 Hashable 프로토콜을 사용해야한다. 이 프로토콜은 Equatable 프로토콜을 상속하며 Equatable에 대한 요구조건도 만족해야한다.

선언만 해도 되는 경우

Hashable을 상속한다고 선언하는 것만으로도 충분한 때가 있다. 컴파일러에서 자동으로 Hashable의 요구사항을 따르도록 해주는 경우인데, 이는 다음과 같은 경우이다.

  • 구조체의 경우, 모든 저장 프라퍼티가 Hashable을 따라야 한다.
  • 열거형의 경우, 모든 연관값이 Hashable을 따라야 한다.(연관값이 없는 enum은 Hashable을 선언하지 않아도 따른다.)

stub 만들기

위 경우가 아닌 커스텀한 타입이 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)
    }
}

https://developer.apple.com/documentation/swift/hashable

post-custom-banner

0개의 댓글