说我的Person课很简单
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
true
people.list.contains(alex)
称一个错误 "cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"
"cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"
有两个contains功能:
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
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或身份)。
name