기어가더라도 제대로

[iOS-Swift] CoreData Model의 Entity가 Hashable - \.self 가 가능해지는 이유 본문

Swift - 데이터베이스

[iOS-Swift] CoreData Model의 Entity가 Hashable - \.self 가 가능해지는 이유

Damagucci-juice 2022. 12. 1. 22:49

ForEach 문에서 \.self 가 가지는 의미 

List {
    ForEach([2, 4, 6, 8, 10], id: \.self) {
        Text("\($0) is even")
    }
}
  • 위의 정수형 배열이 변한다고 했을 때 변하는 값만 추적해서 뷰를 다시 짜야함
  • 배열에서 값이 유일하다고 인정 받기 위해서, Identifiable 이란 프로토콜을 채택하기도 하는데, 그게 없어도 String, Int 처럼 유일함을 인정받을 수 있음
  •  \.self : 그 오브젝트 '자체' 를 식별자로 쓰겠다는 의미
  • 사실 여기서 String, Int 는 Hashable 이라는 프로토콜을 채택하고 있어서 Struct이긴 하지만 해쉬값으로 변환이 가능하기 때문에 \.self 로 사용이 가능함
  • 우리가 추가해주는 커스텀한 타입들도 Hashable 프로토콜을 붙이면 \.self 를 사용할 수 있게됨

Hash 란?

  • "Hash Browns" 에서 왔음, 감자를 잘게 다져서 전처럼 먹는 음식
  • Struct 에 Hashable을 붙이게 되면, Struct 내부에 Property의 값들을 조합해서 하나의 Hash Value 를 만들어냄 
    • Int, String 과 같은 기본적인 타입들은 Hashable 이 채택되어 있어서 \.self 사용 가능
  • Hash-value 를 만들어내는 여러 방법이 있지만 두가지 원칙은 공통적으로 지킴
    • 1. Hash Value 의 Data size 는 고정되어 있다.
    • 2. 하나의 Object를 두 번 Hashing 하였을 때 값은 처음과 두번째가 같다.
      • 같은 값을 해싱하면 결과가 같다. 
  • Hash-Value를 다시 되돌려도 Original Value 를 얻을 수는 없음
  • 사용처: 데이터 검증할 때 쓰임, Hash Value 가 같은 두개의 파일은 사실 동일한 파일이라고 볼 수 있음
  • 해쉬가 쓰이는 곳이 또 있음
    • Set, Dictionary의 Key
      • 유일한 값이라고 인정을 받으니까 바로 접근하기가 빠름

Core Data의 Entity가 \.self 를 사용할 수 있는 이유

  • CoreData에서 만드는 클래스들은 기본적으로 Hashable이 적용되어 있음
  • Struct의 경우에 가지고 있는 프로퍼티의 값들이 같으면 같은 Hash 값이 나옴
  • CoreData 에서 이를 방지하기 위해 Entity에서 프로퍼티를 선택할 때 보이지않는 프로퍼티를 추가하는데, 이것이 ObjectId 임
  • 이 UUID와 같은 ObjectId 덕분에, Hashable을 채택해서 \.self 를 사용할 수가 있음
Comments