【发布时间】: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 协议)。你会在你的代码中造成一些奇怪的、很难跟踪的错误。
标签: arrays swift swift3 equatable