说我有一个非常简单的Person
课程
class Person { var name:String init(name:String) { self.name = name } }
并且我希望将这样的Person
s 的集合存储在属性中,该属性是Person类的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
或身份).
问题:我如何检查people.list是否包含实例alex,好吗?
class Person
是一种引用类型,var alex
是对象存储的引用.的相同,以操作者===
检查是否两个常量或变量指一类的相同的实例.
因此,为了检查列表是否包含
特定实例,请使用基于谓词的contains()
方法,并将实例与===
以下内容进行比较 :
if people.list.contains({ $0 === alex }) { // ... }