Swift 5.+ - 使类可散列?

Posted

技术标签:

【中文标题】Swift 5.+ - 使类可散列?【英文标题】:Swift 5.+ - Making a class hashable? 【发布时间】:2020-05-07 02:38:44 【问题描述】:

我对 swift 很陌生,所以请原谅任何明显的误解。我试图研究但没有好的答案。

我有一个具有以下迭代的 NavigationView

ForEach(listOfStuff, id: \.self)

listOfStuff 被定义为符合 Hashable 的结构,一切正常。

我想将结构更改为一个类,但不知道如何使该类成为 Hashable 以便 \.self 工作(它一直抱怨该类必须是 Hashable)

示例已经过时或一直在谈论结构。我什至不知道我是否可以在 ForEach 中使用一个类?我该怎么办?

谢谢

【问题讨论】:

你当然可以让一个类可散列。但问题是它不会像结构那样自动进行哈希处理(当您声明符合 Hashable 时)。如果你使用一个类,你必须你自己实现哈希。 【参考方案1】:

这是在所描述的用例中使用基于类的模型的示例。使用 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)
            
        
    

【讨论】:

谢谢,这为我解决了。我在我的代码中编写哈希函数,但从未意识到我还必须编写静态 func = ... 这让我发疯了。【参考方案2】:

参见Adopting Common Protocols 和Hashable documentation,两者都概述了制作Hashable 的过程,如outlined by 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,但对于 ForEach 而言,Identifiable 更简单且足够。

【讨论】:

这也很有帮助,谢谢。看例子,我开始理解这个概念。

以上是关于Swift 5.+ - 使类可散列?的主要内容,如果未能解决你的问题,请参考以下文章

使 python 用户定义的类可排序、可散列

如何在不使它们不可变的情况下使 python 数据类可散列?

Swift 中的可散列枚举

列表不可散列,但元组可散列?

Numpy 数组是可散列的吗?

一个协议的可散列协议