说我有一个非常简单的Person课程
class Person {
var name:String
init(name:String) {
self.name = name
}
}
Run Code Online (Sandbox Code Playgroud)
并且我希望将这样的Persons 的集合存储在属性中,该属性是Person类的Person类
class People {
var list:[Person] = []
}
Run Code Online (Sandbox Code Playgroud)
也许我实现如下
var alex = Person(name:"Alex")
var people = People()
people.list.append(alex)
Run Code Online (Sandbox Code Playgroud)
问题:我如何检查people.list是否包含实例alex,好吗?
我的简单尝试,我希望能够回归 true
people.list.contains(alex)
Run Code Online (Sandbox Code Playgroud)
调用错误 "cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"
GoZ*_*ner 45
有两个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
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨,因为编译器知道它Person不是Equatable,因此contains需要有一个predicate但alex不是谓词.
如果你的阵列中的人是Equatable(他们不是)那么你可以使用:
person.list.contains(alex)
Run Code Online (Sandbox Code Playgroud)
由于它们不相同,您可以使用第二个contains函数:
person.list.contains { $0.name == alex.name }
Run Code Online (Sandbox Code Playgroud)
或者,正如Martin R所指出的那样,基于"身份":
person.list.contains { $0 === alex }
Run Code Online (Sandbox Code Playgroud)
或者你可以Person成为Equatable(基于任一name或身份).
Mar*_*n R 20
问题:我如何检查people.list是否包含实例alex,好吗?
class Person是一种引用类型,var alex是对象存储的引用.的相同,以操作者===
检查是否两个常量或变量指一类的相同的实例.
因此,为了检查列表是否包含
特定实例,请使用基于谓词的contains()
方法,并将实例与===以下内容进行比较 :
if people.list.contains({ $0 === alex }) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17556 次 |
| 最近记录: |