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

ale*_*wis 25 swift

说我有一个非常简单的Person课程

class Person {
    var name:String
    init(name:String) {
        self.name = name
    }
}
Run Code Online (Sandbox Code Playgroud)

并且我希望将这样的Persons 的集合存储在属性中,该属性是Person类的Person类

class People {
    var list:[Person] = []
}
Run Code Online (Sandbox Code Playgroud)

也许我实现如下

var alex = Person(name:"Alex")
var people = People()
people.list.append(alex)
Run Code Online (Sandbox Code Playgroud)

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

我的简单尝试,我希望能够回归 true

people.list.contains(alex)
Run Code Online (Sandbox Code Playgroud)

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

GoZ*_*ner 45

有两个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
}
Run Code Online (Sandbox Code Playgroud)

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

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

person.list.contains(alex)
Run Code Online (Sandbox Code Playgroud)

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

person.list.contains { $0.name == alex.name }
Run Code Online (Sandbox Code Playgroud)

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

person.list.contains { $0 === alex }
Run Code Online (Sandbox Code Playgroud)

或者你可以Person成为Equatable(基于任一name或身份).


Mar*_*n R 20

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

class Person是一种引用类型,var alex是对象存储的引用.的相同,以操作者=== 检查是否两个常量或变量指一类的相同的实例.

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

if people.list.contains({ $0 === alex }) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • @BhavinRamani:使用`index(where:{$ 0 === alex})` (2认同)