小编典典

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

swift

说我的Person课很简单

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

我希望将此类Persons 的集合存储在People类的属性中,该属性是类型为Person的数组

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'"


阅读 264

收藏
2020-07-07

共1个答案

小编典典

有两个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 }

或者您可以将Person其设为Equatable(基于name或身份)。

2020-07-07