说我有一个非常简单的Person类
- class Person {
- var name:String
- init(name:String) {
- self.name = name
- }
- }
我希望将一个这样的人的集合存储在一个属性中,该属性是一个Person类的数组,类型为Person
- class People {
- var list:[Person] = []
- }
也许我实现如下
- var alex = Person(name:"Alex")
- var people = People()
- people.list.append(alex)
问题:我如何检查people.list是否包含实例alex,好吗?
我的简单尝试,我希望回归真实
- people.list.contains(alex)
调用错误“无法将类型’Person’的值转换为预期的参数类型’@noescape(Person)throws – > Bool’”
有两个包含功能:
- 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,因此需要包含谓词,但alex不是谓词.
如果你的数组中的人是Equatable(他们不是),那么你可以使用:
- person.list.contains(alex)
由于它们不是等同的,您可以使用第二个包含函数:
- person.list.contains { $0.name == alex.name }
或者,正如Martin R所指出的那样,基于“身份”:
- person.list.contains { $0 === alex }
或者你可以使Person成为Equatable(基于名称或身份).