[SwiftUI] Hashable

Junyoung Park·2022년 8월 18일
0

SwiftUI

목록 보기
12/136
post-thumbnail
post-custom-banner

What is Hashable protocol in SwiftUI? | Continued Learning #12

Hashable

  • ForEach 문에서 Identifiable 프로토콜을 따르지 않는다면 Hashable해야 하는데, id:\.self를 통해 이 Hashable한 오브젝트가 다른 오브젝트와 비교할 때 '유니크함'을 인증할 수 있다.

구현 목표

구현 태스크

  1. Hashable을 통해 ForEach 사용
  2. Identifiable를 통해ForEach 사용

핵심 코드

struct MyCustomModel: Hashable {
}
...
	ForEach(data, id: \.self) { item in
...

소스 코드

import SwiftUI

struct MyCustomModel: Hashable {
    let title: String

    func hash(into hasher: inout Hasher) {
        hasher.combine(title)
    }
}

struct MyCustomModel2: Identifiable {
    let id = UUID().uuidString
    let title: String
}

struct HashableBootCamp: View {
    let data = [
        MyCustomModel(title: "ONE"),
        MyCustomModel(title: "TWO"),
        MyCustomModel(title: "THREE"),
        MyCustomModel(title: "FOUR"),
        MyCustomModel(title: "FIVE")
    ]
    let data2 = [
        MyCustomModel2(title: "ONE"),
        MyCustomModel2(title: "TWO"),
        MyCustomModel2(title: "THREE"),
        MyCustomModel2(title: "FOUR"),
        MyCustomModel2(title: "FIVE")
    ]
    var body: some View {
        ScrollView {
            VStack(spacing: 40) {
                ForEach(data, id: \.self) { item in
                    // self -> String : Hashable itself
                    Text(item.hashValue.description)
                        .font(.headline)
                }
                ForEach(data2) { item in
                    Text(item.title)
                        .font(.headline)
                }
            }
        }
    }
}
  • Hashable보다 Identifiable이 더 간단해보이긴 한다. 구조체를 선언할 때 id로 사용할 수 있는 UUID()을 넣어주면 된다.
  • 하지만 협업 과정에서 id 사용에 혼돈이 올 수 있다면 Hashable 프로토콜을 선언한 뒤 id:\.self를 통해 현재 ForEach에 배열로 들어온 아이템 자체가 Hashable한다. 즉 문제 없이 id로 사용해도 되므로 동일한 효과를 얻을 수 있음을 알고 있자!
profile
JUST DO IT
post-custom-banner

0개의 댓글