检查自定义对象数组是否包含特定的自定义对象

时间:2015-12-29 00:52:12

标签: swift

说我有一个非常简单的Person

class Person {
    var name:String
    init(name:String) {
        self.name = name
    }
}

我希望将一个这样的Person的集合存储在一个属性中,该属性是一个类型为Person的数组,属于People类

class People {
    var list:[Person] = []
}

也许我按照以下方式实现这个目标

var alex = Person(name:"Alex")
var people = People()
people.list.append(alex)

问题:我如何检查people.list是否包含实例alex?

我的简单尝试,我希望返回true

people.list.contains(alex)

调用错误"cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"

2 个答案:

答案 0 :(得分:43)

有两个contains函数:

extension SequenceType where Generator.Element : Equatable {
    /// Return `true` iff `element` is in `self`.
    @warn_unused_result
    public func contains(element: Self.Generator.Element) -> Bool
}

extension SequenceType {
    /// Return `true` iff an element in `self` satisfies `predicate`.
    @warn_unused_result
    public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
}

编译器抱怨,因为编译器知道Person不是Equatable因此contains需要predicatealex不是谓词

如果您的阵列中的人员Equatable(他们不是),那么您可以使用:

person.list.contains(alex)

由于它们不等同,您可以使用第二个contains函数:

person.list.contains { $0.name == alex.name }

或者,正如Martin R指出的那样,基于'身份'用:

person.list.contains { $0 === alex }

或者您可以PersonEquatable(基于name或身份)。

答案 1 :(得分:20)

  

问题:我如何检查people.list是否包含实例alex?

class Person引用类型var alex是引用 到对象存储。 same-to 运算符=== 检查两个常量或变量是否引用同一个实例 一个班级。

因此,为了检查列表是否包含  特定实例,使用基于谓词的contains() 方法,并将实例与===进行比较:

if people.list.contains({ $0 === alex }) {
    // ...
}