develop

Hashable에 대해 본문

iOS

Hashable에 대해

pikachu987 2021. 6. 23. 09:40
반응형

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

 

Apple Developer Documentation

 

developer.apple.com

 

정수 해시 값을 생성하기 위해 Hasher로 해시 할 수있는 유형

 

Hashable과 Hasher는 아래와 같이 생겼다.

 

Hash를 어떻게 사용하냐면

Dictionary나 Set의 Key값을 사용할때 Hashble을 준수하는 타입만 사용할 수 있다.

 

기본타입인 String, Int, enum(associated value 없는 enum은 Hashable 을 자동으로 준수) 등은 해시가 가능한 타입이라 Dictionary나 Set의 Key값에 사용할수 있다.

 

예를 들어 Dictionary의 Key값으로 class를 넣는다고 할때 아래와 같은 클래스는 들어갈 수 없다.

class HashTest {
    
}

var dictTest = [HashTest: String]()

 

HashTest에 Hashable을 추가하여야 한다.

 

Hashable을 추가하면 static func == 함수를 추가하여야 한다.

왜냐하면 Hashable은 Equatable을 상속받고 있기 때문이다.

hashValue는 고유값이여야 하기 때문에 고유값인지 비교해줄 수 있는 == 함수가 필요하다.

 

class HashTest: Hashable {
    var value: Int

    init(_ value: Int) {
        self.value = value
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(value)
    }

    static func == (lhs: HashTest, rhs: HashTest) -> Bool {
        return lhs.value == rhs.value
    }
}

var dictTest = [HashTest: String]()
dictTest[HashTest(5)] = "5"

이렇게 일부 메서드를 구현하면 Dictionary나 Set의 Key값으로 사용할 수 있게 된다.

Hasher의 combine은 해시값에 주어진 값을 더하여 혼합한다고 한다.

https://developer.apple.com/documentation/swift/hasher/2995578-combine

 

Apple Developer Documentation

 

developer.apple.com

 

구조체에서 저장 프로퍼티가 모두 Hashable하면 hash메서드가 자동으로 제공이 된다.

struct HashTest: Hashable {
    var firstValue: Int
    var secondValue: String
}

var dictTest = [HashTest: String]()

 

반응형
Comments