SwiftUI 符合 Hashable

Ham*_*dar 5 swiftui

我们如何让 SwiftUI 对象,尤其是 Image 符合 Hashable 协议?

我知道它们符合 Equatable 协议,所以主要问题是如何获取 Hash 值或使用该hash(into:)函数?

fuz*_*uzz 3

\n

在 Swift 中,遵守Hashable协议通常就像添加Hashable到一致性列表一样简单。但是,如果您有自定义要求,或者使用不\xe2\x80\x99t全部符合的属性Hashable,则需要更多的工作。

\n
\n\n

这里\xe2\x80\x99是我们可以使用的示例结构:

\n\n
struct iPad: Hashable {\n    var serialNumber: String\n    var capacity: Int\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

因为它符合Hashable协议,并且它的两个属性也符合Hashable协议,所以 Swift 会hash(into:)自动生成一个方法。

\n\n

然而,在这种情况下,我们可以看到这serialNumber足以唯一地识别每台 iPad,因此不需要散列容量\xe2\x80\x99。因此,我们可以编写自己的哈希实现,hash(into:)仅对这一属性进行哈希处理:

\n
\n\n
func hash(into hasher: inout Hasher) {\n    hasher.combine(serialNumber)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

您可以通过重复调用向哈希添加更多属性combine(),并且添加属性的顺序会影响最终的哈希值。

\n
\n\n

Swift 每次对对象进行哈希处理时都会使用随机种子,这意味着任何对象的哈希值都可以有效地保证在应用程序运行之间不同。

\n\n

这反过来意味着每次运行应用程序时,添加到集合或字典中的元素很可能具有不同的顺序。

\n\n

来源:https ://www.hackingwithswift.com/example-code/language/how-to-conform-to-the-hashable-protocol

\n\n

也可能有帮助。

\n

  • 这解释了一般如何进行散列,但是它如何应用于像 Image 这样没有公共属性的东西呢?大多数 SwiftUI 视图都是这样的。 (4认同)