【问题标题】:How to use "contains" with two arrays of objects如何对两个对象数组使用“包含”
【发布时间】:2015-01-11 13:04:26
【问题描述】:

我有类产品

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 只是字符串数组时,它可以正常工作,但现在我需要对象。

关于错误:首先是“无法找到接受所提供参数的“!”的重载。删除感叹号后,它是“无法调用包含类型为 '(@lvalue[Products,$T8 )'

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及重现它所需的最短代码在问题本身。
  • “我得到错误”没有描述问题。
  • 当然,原谅我。首先是“找不到“!”的重载,它接受提供的参数。删除感叹号后,它是“无法调用包含类型为'(@lvalue[Products,$T8)'的参数列表”
  • 不要说话和展示小sn-ps,请将您的代码简化为其他人可以从堆栈溢出中删除的可重现完整示例并粘贴并尝试自己编译以查看问题所在。如果您需要帮助,请帮助您了解问题所在。

标签: ios arrays swift


【解决方案1】:

为了使contains() 函数工作,Products 类应该实现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
}

【讨论】:

  • 另外,您不需要定义 != 运算符,因为它的实现是从标准库派生的,这很方便。
  • 谢谢,它有效。我总是做类似 var elements = [1,2,3,4,5] if contains(elements, 5) { println("yes") }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2019-05-20
  • 1970-01-01
  • 2018-12-17
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多