What is Hashable protocol in SwiftUI? | Continued Learning #12
ForEach
문에서 Identifiable
프로토콜을 따르지 않는다면 Hashable
해야 하는데, id:\.self
를 통해 이 Hashable
한 오브젝트가 다른 오브젝트와 비교할 때 '유니크함'을 인증할 수 있다. Hashable
을 통해 ForEach
사용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
로 사용해도 되므로 동일한 효과를 얻을 수 있음을 알고 있자!