【问题标题】:How to find if array contains object如何查找数组是否包含对象
【发布时间】:2016-03-09 15:28:28
【问题描述】:

我创建了一个名为 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'

【问题讨论】:

标签: arrays swift


【解决方案1】:

试试这个:

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
}

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

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

【讨论】:

  • 这将比较指针,而不是对象相等 iirc(我没有反对)。
  • 添加了一个替代解决方案,希望反对者可能会喜欢它:)
  • 在我的场景中,指针比较很好。我很欣赏这两个答案。谢谢!
【解决方案2】:

几个问题:

contains 接受一个闭包。您需要像这样进行比较:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多