1

如何检查 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实例?

真的有那么复杂吗?

谢谢!

4

2 回答 2

3
=== 

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

所以你Equatable可能看起来像这样:

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

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

于 2016-10-16T17:50:56.707 回答
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
}
于 2016-10-16T17:47:27.693 回答