Swift 5.+ - 使 class 可散列?
Swift 5.+ - Making a class hashable?
我是 swift 的新手,所以请原谅任何明显的误解。我已经尝试研究但没有好的答案。
我有一个具有以下迭代的 NavigationView
ForEach(listOfStuff, id: \.self)
listOfStuff
被定义为符合 Hashable 的结构,一切正常。
我想将结构更改为 class,但不知道如何使 class 可哈希以便 \.self
起作用(它一直抱怨class 必须是 Hashable)
例子是旧的或继续谈论结构。我什至不知道我是否可以在 ForEach 中使用 class?我该怎么办?
谢谢
这是在所述用例中使用基于 class 的模型的示例。使用 Xcode 11.4
测试
class Stuff: Hashable, Equatable {
static func == (lhs: Stuff, rhs: Stuff) -> Bool {
lhs.title == rhs.title
}
func hash(into hasher: inout Hasher) {
hasher.combine(title)
}
var title: String = ""
}
struct StaffView: View {
let listOfStaff: [Stuff]
var body: some View {
ScrollView {
ForEach(listOfStaff, id: \.self) { stuff in
Text(stuff.title)
}
}
}
}
参见 Adopting Common Protocols and Hashable documentation, both of which outline the process of making it Hashable
, as 。
但你不必制作整个东西 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
.
来说更简单且足够了
我是 swift 的新手,所以请原谅任何明显的误解。我已经尝试研究但没有好的答案。
我有一个具有以下迭代的 NavigationView
ForEach(listOfStuff, id: \.self)
listOfStuff
被定义为符合 Hashable 的结构,一切正常。
我想将结构更改为 class,但不知道如何使 class 可哈希以便 \.self
起作用(它一直抱怨class 必须是 Hashable)
例子是旧的或继续谈论结构。我什至不知道我是否可以在 ForEach 中使用 class?我该怎么办?
谢谢
这是在所述用例中使用基于 class 的模型的示例。使用 Xcode 11.4
测试class Stuff: Hashable, Equatable {
static func == (lhs: Stuff, rhs: Stuff) -> Bool {
lhs.title == rhs.title
}
func hash(into hasher: inout Hasher) {
hasher.combine(title)
}
var title: String = ""
}
struct StaffView: View {
let listOfStaff: [Stuff]
var body: some View {
ScrollView {
ForEach(listOfStaff, id: \.self) { stuff in
Text(stuff.title)
}
}
}
}
参见 Adopting Common Protocols and Hashable documentation, both of which outline the process of making it Hashable
, as
但你不必制作整个东西 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
.