如何对两个对象数组使用 "contains"

How to use "contains" with two arrays of objects

我有class个产品

class Products {

    var name:String = ""
    var number:Int = 0

    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
}

然后在视图控制器中

var productFirst:[Products] = [Products(name: "First", number: 1)]
var productSecond:[Products] = [Products]()

我使用 productFirst 填充 tableView。

我想将选定的行添加到 productSecond 并且有效:

productSecond.append(productFirst[indexPath.row])

但我不想重复数组中的项目,所以我做了

if !contains(productSecond, productFirst[indexPath.row]) {
    productSecond.append(productFirst[indexPath.row])
}

我收到错误消息。怎么改?当 productFirst 和 productSeconds 只是字符串数组时,它工作正常,但现在我需要对象。

关于错误:首先是 "could not find an overload for "!" 接受提供的参数。删除感叹号后它是"无法调用包含类型为 '(@lvalue[Products,$T8) '

要使 contains() 功能正常工作,Products class 应该实施 Equatable 协议。只有这样我们才能检查两个元素是否相等。

class Products : Equatable {

    var name:String = ""
    var number:Int = 0

    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
}

func ==(lhs: Products, rhs: Products) -> Bool
{
    return lhs.name == rhs.name && lhs.number == rhs.number
}