如何查找数组是否包含对象

时间:2016-03-09 15:28:28

标签: arrays swift

我创建了一个名为MenuItem的自定义类:

import Foundation

class MenuItem {

    var title: String
    var tag: Int
    var image: UIImage

    init (title: String, tag: Int, image: UIImage) {
        self.title = title
        self.tag = tag
        self.image = image
    }

}

我将这些对象添加到数组中。

如何检查数组是否包含特定的菜单项?

这是我尝试过的简化版本。

let menuOptionInventory = MenuItem(title: "Inventory", tag: 100, image: UIImage(imageLiteral: "871-handtruck"))
var menuOptions = [MenuItem]()
menuOptions.append(menuOptionInventory)

if (menuOptions.contains(menuOptionInventory)) {
    //does contain object
}

当我这样做时,我收到以下错误消息:

Cannot convert value of type 'MenuItem' to expected argument type '@noescape (MenuItem) throws -> Bool'

2 个答案:

答案 0 :(得分:2)

试试这个:

if menuOptions.contains( { $0 === menuOptionInventory } ) {
    //does contain object
}

编辑:正如JAL所指出的,这确实比较了指针。

因此,您可以专门覆盖==运算符,以便比较两个MenuItem对象:

func == (lhs: MenuItem, rhs: MenuItem) -> Bool {
    return lhs.title == rhs.title && lhs.tag == rhs.tag && lhs.image == rhs.image
}

然后你可以使用contains方法闭包来执行对象之间的比较。

if menuOptions.contains( { $0 == menuOptionInventory } ) {
    //does contain object
}

答案 1 :(得分:1)

一些问题:

contains关闭。您需要像这样进行比较:

if menuOptions.contains( { $0 == menuOptionInventory } ) {
    // do stuff
}

但现在您将遇到==无法应用于两个MenuItem对象的问题。使您的对象符合HashableEquatable并定义两个MenuItem对象的相同方式,或者为您使用符合HashableEquatable的基类,例如NSObject