SwiftUI符合Hashable

时间:2019-12-17 22:49:25

标签: swiftui

我们如何使SwiftUI对象(尤其是Image)符合哈希协议?

我知道它们符合Equatable协议,因此主要问题将是如何获取哈希值或使用=IF( Sheet1!$B$11="Blue Chip", INDEX( 'Mtly Interp BASE'!$B$2:$G$1048576, MATCH( 'Supplemental Rates_Base'!IM$4, 'Mtly Interp BASE'!$A$2:$A$1048576, 0 ), MATCH( 'Supplemental Rates_Base'!$B112, 'Mtly Interp BASE'!$B$1:$G$1, 0 ) ), IF( Sheet1!$B$11="Consensus", INDEX( 'Consensus Monthly'!$B$12:$EG$800, MATCH( 'Supplemental Rates_Base'!IM$4, 'Consensus Monthly'!$A$12:$A$800, 0 ), MATCH( 'Supplemental Rates_Base'!$B112, 'Consensus Monthly'!$B$1:$EG$1, 0 ) ) / 100 ) ), IF( Sheet1!$B$11="Moody Base", INDEX( 'Moody''s Monthly'!$B$12:$CE$800, MATCH( 'Supplemental Rates_Base'!IM$4, 'Moody''s Monthly'!$A$12:$A$800, 0 ), MATCH( 'Supplemental Rates_Base'!$B112, 'Moody''s Monthly'!$B$1:$CE$1, 0 ) ) / 100 ) ) 函数?

1 个答案:

答案 0 :(得分:1)

  

在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

This也可能有帮助。