检查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

但是,== 的实现显然不是我想要的。我真正希望它返回的是问题的答案:lhsrhs 是否相同 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 

编辑:但更好的解决方案是实现相等而不是标识,例如类中的 vendortype 属性

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数组是不是包含对象实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift:确定自定义对象数组是不是包含特定字符串[重复]

检查 Swift 数组上的重复属性

检查两个数组是不是包含相同的对象 - 反应 componentDidUpdate [重复]

swift 数组不包含实例变量

Swift 3:通过遍历视图数组来设置视图

如何检查字符串是不是已包含 Swift 中的字符 [重复]