Arrays 检查Swift数组是否包含对象的实例

Arrays 检查Swift数组是否包含对象的实例,arrays,swift,swift3,equatable,Arrays,Swift,Swift3,Equatable,如何检查Swift数组是否包含对象的特定实例?考虑这个简单的例子: class Car {} let mazda = Car() let toyata = Car() let myCars = [mazda, toyata] myCars.contains(mazda) // ERROR! 我的调查让我得出结论,Car类必须采用equalable协议。情况似乎是这样的: class Car: Equatable { static func ==(lhs: Car, rhs: Ca

如何检查Swift数组是否包含对象的特定实例?考虑这个简单的例子:

class Car {}

let mazda = Car()
let toyata = Car()

let myCars = [mazda, toyata]

myCars.contains(mazda) // ERROR!
我的调查让我得出结论,
Car
类必须采用
equalable
协议。情况似乎是这样的:

class Car: Equatable {
    static func ==(lhs: Car, rhs: Car) -> Bool {
        return true
    }
}
然后
myCars.contains(马自达)
确实返回
true

然而,
==
的实现显然不是我想要的。我真正希望它返回的是问题的答案:
lhs
rhs
是相同的
Car
实例吗

真的有那么复杂吗

谢谢

使用标识运算符

甚至没有
equalable

myCars.contains{ $0 === mazda }
编辑:但更好的解决方案是实现相等而不是标识,例如类中的
供应商
类型
属性

static func ==(lhs: Car, rhs: Car) -> Bool {
   return lhs.vendor == rhs.vendor && lhs.type == rhs.type
}
使用标识运算符

甚至没有
equalable

myCars.contains{ $0 === mazda }
编辑:但更好的解决方案是实现相等而不是标识,例如类中的
供应商
类型
属性

static func ==(lhs: Car, rhs: Car) -> Bool {
   return lhs.vendor == rhs.vendor && lhs.type == rhs.type
}
Swift中的运算符检查两个对象引用是否都引用同一个对象实例

因此,您的
equalable
可以如下所示:

   static func ==(lhs: Car, rhs: Car) -> Bool {
        return lhs===rhs
    }
我不推荐这种方法
equalable
的目的不是评估对同一对象的引用

Swift中的运算符检查两个对象引用是否都引用同一个对象实例

因此,您的
equalable
可以如下所示:

   static func ==(lhs: Car, rhs: Car) -> Bool {
        return lhs===rhs
    }


我不推荐这种方法
equalable
的目的不是评估对同一对象的引用

“lhs和rhs是相同的汽车实例吗?”-不,问题应该是“lhs和rhs代表相同的等效汽车吗?”。它们不需要是相同的实例才能相等。不,这不是我想要的。在我的例子中(不是汽车玩具的例子),我真的很想知道它们是否是同一个例子。无论如何,这个问题用===运算符解决了。以前从没听说过这个,这不是它的工作原理。您违反了
equalable
协议(以及Hashable协议)的语义。您将在代码中导致一些奇怪的、很难跟踪的错误。“lhs和rhs是相同的汽车实例吗?”-不,问题应该是“lhs和rhs代表相同的等效汽车吗?”。它们不需要是相同的实例才能相等。不,这不是我想要的。在我的例子中(不是汽车玩具的例子),我真的很想知道它们是否是同一个例子。无论如何,这个问题用===运算符解决了。以前从没听说过这个,这不是它的工作原理。您违反了
equalable
协议(以及Hashable协议)的语义。你将在你的代码中引起一些奇怪的,很难追踪的错误。不要这样做。它违反了Equatable(和Hashtable)协议的语义。@我知道rmaddy,但是OP想要一个“便宜”的解决方案。那么,你还能做什么呢?我有一个Graph类,它基本上是一个顶点对象数组。如何回答:图形对象是否包含特定的顶点?不,我不想要便宜的解决方案。我想要一个好的解决方案:-)@MichaelKnudsen如果你想要一个好的解决方案,不要使用
===
来实现
=
。首先用你的实际代码来更新你的问题,而不是伪造的“汽车”样本。
=
必须检查两个对象是否等效,而不是相同的实例。您可以通过比较属性值来执行此操作。不要执行此操作。它违反了Equatable(和Hashtable)协议的语义。@我知道rmaddy,但是OP想要一个“便宜”的解决方案。那么,你还能做什么呢?我有一个Graph类,它基本上是一个顶点对象数组。如何回答:图形对象是否包含特定的顶点?不,我不想要便宜的解决方案。我想要一个好的解决方案:-)@MichaelKnudsen如果你想要一个好的解决方案,不要使用
===
来实现
=
。首先用你的实际代码来更新你的问题,而不是伪造的“汽车”样本。
=
必须检查两个对象是否等效,而不是相同的实例。您可以通过比较属性值来执行此操作。不要执行此操作。它违反了Equatable(和Hashtable)协议的语义,我同意你的观点,使用Equatable感觉有点不对劲。我(试图)做一个无向图的简单实现。基本上只是一个顶点列表,我想问:我的图是否包含一个特定的顶点?但为什么它需要相同的引用?顶点属性可以通过x和y值进行比较@vadian提供了一个上面的相等属性比较示例。请不要这样做。它违反了Equatable(和Hashtable)协议的语义,我同意你的观点,使用Equatable感觉有点不对劲。我(试图)做一个无向图的简单实现。基本上只是一个顶点列表,我想问:我的图是否包含一个特定的顶点?但为什么它需要相同的引用?顶点属性可以通过x和y值进行比较@vadian提供了上述等式属性比较的示例。