37

say i have a very simple Person class

class Person {
    var name:String
    init(name:String) {
        self.name = name
    }
}

and i wish to store a collections of such Persons in a property, which is an array with type Person, of a People class

class People {
    var list:[Person] = []
}

perhaps i achieve this as follows

var alex = Person(name:"Alex")
var people = People()
people.list.append(alex)

QUESTION: how do i check if people.list contains the instance alex, please?

my simple attempt, which i was hoping to return true

people.list.contains(alex)

calls an error "cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"

2 Answers 2

53

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).

Sign up to request clarification or add additional context in comments.

2 Comments

many thanks - and to @Martin R: "theperson.list.contains { $0 === alex }" worked a charm :-)
in case anyone is wondering what "$0" stands for -> stackoverflow.com/questions/27491620/…
24

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 }) {
    // ...
}

2 Comments

How can we get index where condition becomes true?
This is really very useful answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.