gpt4 book ai didi

Swift 5.0 "Set"允许重复值

转载 作者:搜寻专家 更新时间:2023-10-31 22:36:50 24 4
gpt4 key购买 nike

在 Swift 5.0 Playground 中,我正在尝试对 CGPoint 进行扩展,以便它根据散列和相等性将点视为整数值。

令我惊讶的是,即使在覆盖 CGPoint 上的 hash()== 之后,一组 CGPoint 仍然保持与独立的相似值即使两个元素应该发生碰撞并且只保留一个元素,也要点。您是否需要在 CGPoint 上重写某些其他方法才能按预期工作?

附言在实践中最好不要这样做,因为它可能会影响系统,最好提供某种包装器来管理平等。但我想知道为什么这不起作用。

Playground 内容以及执行后给出的结果:

// Extension to treat points as integer values (not reccomended approach)
extension CGPoint : Hashable {
public func hash(into hasher: inout Hasher) {
hasher.combine(Int(x))
hasher.combine(Int(y))
}

static public func == (lhs: CGPoint, rhs: CGPoint) -> Bool {
return Int(lhs.x) == Int(rhs.x) && Int(lhs.y) == Int(rhs.y)
}
}

var pSet : Set<CGPoint> = []

let p1 = CGPoint.zero
let p2 = CGPoint(x: 20.1, y: 30)
let p3 = CGPoint(x:20, y: 30)

pSet.insert(p1) // inserted true
pSet.insert(p2) // inserted true
pSet.insert(p3) // inserted true(!), should be false

p2 == p3 // true

pSet.count // 3(!), should be two
p2.hashValue // Same as p3
p3.hashValue // Same as p2

pSet // shows all three values, all points defined, should be two values only

最佳答案

rmaddy 和 Martin R 确定了这个问题,但这里是一个答案:Set 不使用您的 == 函数。它使用了标准库中定义的==函数,因为Set是在标准库中定义的。您可以通过调用 print 来证明这一点是您的 == 函数。当您在 Set 中插入一个点时,您会看到您的 print 没有运行。

关于Swift 5.0 "Set"允许重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56945958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com