说我有一个非常简单的Person
类
class Person {
var name:String
init(name:String) {
self.name = name
}
}
我希望将一个这样的Person
的集合存储在一个属性中,该属性是一个类型为Person的数组,属于People类
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'"
答案 0 :(得分:43)
有两个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
或身份)。
答案 1 :(得分:20)
问题:我如何检查people.list是否包含实例alex?
class Person
是引用类型,var alex
是引用
到对象存储。 same-to 运算符===
检查两个常量或变量是否引用同一个实例
一个班级。
因此,为了检查列表是否包含
特定实例,使用基于谓词的contains()
方法,并将实例与===
进行比较:
if people.list.contains({ $0 === alex }) {
// ...
}