Arrays 检查Swift数组是否包含对象的实例
如何检查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
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提供了上述等式属性比较的示例。