say i have a very simple Person
class
class Person {
var name:String
init(name:String) {
self.name = name
}
}
QUESTION: how do i check if people.list contains the instance alex, please?
class Person
is a reference type, and var alex
is a reference
to the object storage. The identical-to operator ===
checks if two constants or variables refer to the same instance
of a class.
Therefore, in order to check if the list contains a
specific instance, use the predicate-based contains()
method, and compare instances with ===
:
if people.list.contains({ $0 === alex }) {
// ...
}
There are two contains
functions:
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
}
The compiler is complaining because the compiler knows that Person
is not Equatable
and thus contains
needs to have a predicate
but alex
is not a predicate.
If the people in your array are Equatable
(they aren't) then you could use:
person.list.contains(alex)
Since they aren't equatable, you could use the second contains
function with:
person.list.contains { $0.name == alex.name }
or, as Martin R points out, based on 'identity' with:
person.list.contains { $0 === alex }
or you could make Person
be Equatable
(based on either name
or identity).