插入数据时Swift Set类型性能不一致



RoadmapCardChain实现HashableEquatable协议时,此代码将生成不同的结果

struct RoadmapCardChain: Codable, Hashable, Equatable {
let start: String
let end: String
let styles: String

static func == (lhs: RoadmapCardChain, rhs: RoadmapCardChain) -> Bool {
let isStyleSame = lhs.styles == rhs.styles
let isEndSame = lhs.start == rhs.start && lhs.end == rhs.end
let isToggleEndSame = lhs.start == rhs.end && lhs.end == rhs.start
print(lhs)
print(rhs)
print("result is (isStyleSame && ( isEndSame || isToggleEndSame ))")
return isStyleSame && ( isEndSame || isToggleEndSame )
}
}
let a = RoadmapCardChain(start: "Cafeteria", end: "Payment BIZ", styles: "AECC5C")
let b = RoadmapCardChain(start: "Payment BIZ", end: "Cafeteria", styles: "AECC5C")
var chains: Set<RoadmapCardChain> = []
print(a.hashValue)
print(b.hashValue)
chains.insert(a)
if chains.contains(b) {
print("contains is true")
} else {
chains.insert(b)
}
print(chains)

有时结果是:

785027920194053578
6404817261741129101
RoadmapCardChain(start: "Cafeteria", end: "Payment BIZ", styles: "AECC5C")
RoadmapCardChain(start: "Payment BIZ", end: "Cafeteria", styles: "AECC5C")
result is true
contains is true
[__lldb_expr_19.RoadmapCardChain(start: "Cafeteria", end: "Payment BIZ", styles: "AECC5C")]

但有时结果是:

491382166321900052
7275567105868021174
[__lldb_expr_21.RoadmapCardChain(start: "Cafeteria", end: "Payment BIZ", styles: "AECC5C"), __lldb_expr_21.RoadmapCardChain(start: "Payment BIZ", end: "Cafeteria", styles: "AECC5C")]

我不知道为什么相同的代码有不同的性能

苹果的Hashable文档指出:

两个相等的实例必须以相同的顺序向hash中的Hasher提供相同的值(into:(。

但您打破了这一要求,因为在您的==实现中,两个属性不同的对象(即用于馈送Hasher的对象(被认为是相等的,即在您的示例中,a == btrue,尽管具有不同的.start.end属性。

Equatable一致性下,对象相等(==(意味着一个对象可以替换另一个对象而没有任何副作用。在你的情况下,他们并不是真正平等的。

如果你真的认为他们";等于";在某些业务规则下,则应该实现不同的比较方法(例如isSimilarTo(,而不更改==的意图。

相关内容

  • 没有找到相关文章

最新更新