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.

来说更简单且足够了