Hassan Mahmood
Hassan Mahmood

Reputation: 1601

Check if array contains element

I have a class called Person:

class Person{

  let name: String?
  let areas: [Area]
}

And Area consisting of the following:

class Area{
  let id: String
  let name: String
}

I've created a "people" array and what I want to do is check the "people" array if area.name = "Brooklyn". If it doesn't remove that person from the "people" array.

Here is what I have tried but it doesn't work:

var people = [Person]()

for s in people{

  for a in s.preferredArea{

    if a.areaName != "Brooklyn"{

       let index = people.indexOf(s)
       people.removeAtIndex(index!)
    }
  }
}

Can anyone point me into the right direction please?

Upvotes: 0

Views: 105

Answers (1)

Eendje
Eendje

Reputation: 8883

To use indexOf, you'll have to make Person conforming the protocol Equatable:

class Person: Equatable {

    let name: String
    var area: [Area]

    init(name: String) {
        self.name = name
        self.area = []
    }
}

func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.name == rhs.name &&
           lhs.area == rhs.area      // You'll have to make Area equatable too
}

Having this done, your code just works fine. If you don't want to use this method, you can use:

people.enumerate().forEach {
    if !$0.1.area.contains({ $0.name == "Brooklyn" }) {
        people.removeAtIndex($0.0)
    }
}

Or if you can use filter to create a new array:

var newPeople = people.filter { $0.area.contains { $0.name == "Brooklyn" } }

Upvotes: 2

Related Questions