develop
Hashable에 대해 본문
https://developer.apple.com/documentation/swift/hashable
정수 해시 값을 생성하기 위해 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
구조체에서 저장 프로퍼티가 모두 Hashable하면 hash메서드가 자동으로 제공이 된다.
struct HashTest: Hashable {
var firstValue: Int
var secondValue: String
}
var dictTest = [HashTest: String]()
'iOS' 카테고리의 다른 글
hugging, compression resistance에 대해서 (0) | 2021.07.12 |
---|---|
frame과 bounds의 차이 (0) | 2021.07.11 |
==과 ===의 차이, closure의 === (0) | 2021.06.22 |
iOS에서 srt, smi 파일 한글 깨지는 문제 (0) | 2021.03.01 |
UITableView UICollectionView Reorder (0) | 2021.02.07 |