SwiftUI符合哈希协议

9
我们如何使 SwiftUI 对象,特别是 Image,符合 Hashable 协议?
我知道它们符合 Equatable 协议,所以主要问题是如何获取哈希值或使用 hash(into:) 函数?

1
我怀疑目前这是不可能的。你想用它的哈希值做什么?也许有其他的方法。 - Rob Napier
1个回答

2
在Swift中,遵循“Hashable”协议通常只需要将“Hashable”添加到您的符合列表中就可以了。然而,如果您有自定义要求或使用的属性不都符合“Hashable”,则需要更多的工作。
以下是我们可以使用的示例结构体:
struct iPad: Hashable {
    var serialNumber: String
    var capacity: Int
}

由于该属性符合Hashable协议,且其两个属性也符合Hashable协议,因此Swift会自动生成hash(into:)方法。
然而,在这种情况下,我们可以看到serialNumber足以唯一标识每个iPad,因此不需要哈希容量。因此,我们可以编写自己的实现hash(into:)方法,仅对该属性进行哈希处理。
func hash(into hasher: inout Hasher) {
    hasher.combine(serialNumber)
}

您可以通过重复调用combine()方法来向哈希表中添加更多属性,而您添加属性的顺序会影响最终的哈希值。
Swift在每次对对象进行哈希时都使用随机种子,这意味着任何对象的哈希值在应用程序每次运行时都是不同的。
这反过来又意味着,您添加到集合或字典中的元素很可能在每次运行应用程序时都有不同的顺序。
来源:https://www.hackingwithswift.com/example-code/language/how-to-conform-to-the-hashable-protocol 这篇文章也可能会有所帮助。

4
这解释了哈希的一般概念,但是对于像图片这样没有公共属性的东西,它如何应用?大多数SwiftUI视图都是这样。 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接