См. Принятие общих протоколов и Хэшируемая документация , оба из которых описывают процесс создания Hashable
, как , описанный Asperi .
Но вам не обязательно делать все Hashable
. Вы можете указать какое-либо свойство, по которому его можно идентифицировать, например
class Item {
let id: UUID
let string: String
init(string: String) {
self.id = UUID()
self.string = string
}
}
и
struct ContentView: View {
let items: [Item]
var body: some View {
ScrollView {
ForEach(items, id: \.id) { item in
Text(item.string)
}
}
}
}
Или, что еще лучше, сделайте его Identifiable
, например
class Item: Identifiable {
let id: UUID
let string: String
init(string: String) {
self.id = UUID()
self.string = string
}
}
struct ContentView: View {
let items: [Item]
var body: some View {
ScrollView {
ForEach(items) { item in
Text(item.string)
}
}
}
}
Вы можете сделать это Hashable
, если хотите, но Identifiable
проще и достаточно для целей ForEach
.