检查Swift数组是不是包含对象实例[重复]
Posted
技术标签:
【中文标题】检查Swift数组是不是包含对象实例[重复]【英文标题】:Check if Swift array contains instance of object [duplicate]检查Swift数组是否包含对象实例[重复] 【发布时间】:2016-10-16 17:41:27 【问题描述】:如何检查 Swift 数组是否包含对象的特定实例?考虑这个简单的例子:
class Car
let mazda = Car()
let toyata = Car()
let myCars = [mazda, toyata]
myCars.contains(mazda) // ERROR!
我的调查让我得出结论,Car
类必须采用Equatable
协议。好像是这样:
class Car: Equatable
static func ==(lhs: Car, rhs: Car) -> Bool
return true
那么myCars.contains(mazda)
确实返回true
。
但是,==
的实现显然不是我想要的。我真正希望它返回的是问题的答案:lhs
和 rhs
是否相同 Car
实例?
真的有那么复杂吗?
谢谢!
【问题讨论】:
“lhs 和 rhs 是同一个 Car 实例吗?” - 不,问题应该是“lhs 和 rhs 是否代表相同的等价 Cars?”。它们不需要是相同的实例就可以相等。 不,这不是我想要的。就我而言(不是汽车的玩具示例),我真的很想知道它们是否是同一个实例。无论如何,使用 === 运算符解决了问题。以前从未听说过。 这不是它应该如何工作的。您违反了Equatable
协议的语义(因此违反了 Hashable 协议)。你会在你的代码中造成一些奇怪的、很难跟踪的错误。
【参考方案1】:
===
Swift 中的运算符检查两个对象引用是否都引用同一个对象实例。
所以你的Equatable
可能看起来像这样:
static func ==(lhs: Car, rhs: Car) -> Bool
return lhs===rhs
我确实不推荐这种方法。 Equatable
的目的不是评估对同一对象的引用。
【讨论】:
不要这样做。它违反了 Equatable(和 Hashable)协议的语义。 我同意你的观点,使用 Equatable 感觉有点不对。我正在(试图)做一个无向图的简单实现。基本上只是一个顶点列表,我想问:我的图是否包含特定的顶点? 但是为什么它需要是同一个引用呢?顶点属性可以通过 x 和 y 值进行比较。 @vadian 提供了上面相等属性比较的示例。【参考方案2】:使用恒等运算符
static func ==(lhs: Car, rhs: Car) -> Bool
return lhs === rhs
甚至没有Equatable
myCars.contains $0 === mazda
编辑:但更好的解决方案是实现相等而不是标识,例如类中的 vendor
和 type
属性
static func ==(lhs: Car, rhs: Car) -> Bool
return lhs.vendor == rhs.vendor && lhs.type == rhs.type
【讨论】:
不要这样做。它违反了 Equatable(和 Hashable)协议的语义。 @rmaddy 我知道,但 OP 想要一个“便宜”的解决方案。 那你还能做什么呢?我有一个 Graph 类,它基本上是一个 Vertex 对象的数组。你会如何回答:Graph 对象是否包含特定的 Vertex? 不,我不想要便宜的解决方案。我想要一个好的解决方案:-) @MichaelKnudsen 如果您想要一个好的解决方案,请不要使用===
来实现==
。首先使用您的实际代码而不是假的“汽车”示例更新您的问题。 ==
必须检查两个对象是否相等,而不是同一个实例。您可以通过比较属性值来做到这一点。以上是关于检查Swift数组是不是包含对象实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章