检查自定义对象数组是否包含特定的自定义对象
说我的Person
课很简单
class Person {
var name:String
init(name:String) {
self.name = name
}
}
我希望将此类Person
s 的集合存储在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'"
-
有两个
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
需要一个谓词,predicate
但alex
不是谓词。如果阵列中的人员是
Equatable
(不是),则可以使用:person.list.contains(alex)
由于它们不相等,因此可以将第二个
contains
函数与以下函数一起使用:person.list.contains { $0.name == alex.name }
或正如Martin R所指出的,基于“身份”:
person.list.contains { $0 === alex }
或者您可以将
Person
其设为Equatable
(基于name
或身份)。