当RoadmapCardChain
实现Hashable
和Equatable
协议时,此代码将生成不同的结果
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 == b
是true
,尽管具有不同的.start
和.end
属性。
在Equatable
一致性下,对象相等(==
(意味着一个对象可以替换另一个对象而没有任何副作用。在你的情况下,他们并不是真正平等的。
如果你真的认为他们";等于";在某些业务规则下,则应该实现不同的比较方法(例如isSimilarTo
(,而不更改==
的意图。