Подтвердить что ты не робот

Как перебирать массив объектов в Swift?

У меня есть объекты

var person1 = Person()
person1.name = "Joe"
person1.lastName = "Doe"
person1.age = 21

var person2 = Person()
person2.name = "Julia"
person2.lastName = "Ivanova"
person2.age = 22

var person3 = Person()
person3.name = "Irina"
person3.lastName = "Petrova"
person3.age = 25

var person9 = Person()
person9.name = "Vova"
person9.lastName = "Vovin"
person9.age = 32

var person10 = Person()
person10.name = "Masha"
person10.lastName = "Golovanova"
person10.age = 20

var person11 = Person()
person11.name = "Petra"
person11.lastName = "Andreeva"
person11.age = 27

и multi array

var array = [[person1, person2, person3], [person9, person10, person11]]

как я могу перебирать массив, чтобы получить, например, человека с name= "Маша"

заблаговременно

4b9b3361

Ответ 1

Я бы попробовал это:

var array:[[Person]] = [[person1, person2, person3], [person9, person10, person11]]
/*Casting it like this should keep from getting an error later 
   and/or having to recast the objects*/

for people in array {

/*This is going to look at each array in arrays, 
   and call each one 'people' within this loop*/

    for person in people {

    /*Same thing, this is going to look at each item in the people array
       and call each one 'person' within this loop*/

        if person.name == "Masha" {
            return person
        }
    }
}

Ответ 2

Интересным способом решения этой проблемы будет использование функции FlatMap Swift.

var array = [[person1, person2, person3], [person9, person10, person11]]

let flatArray = array.flatMap { $0 }

flatArray теперь [person1, person2, person3, person9, person10, person11] типа Array<Person>.

Затем вы можете выполнить итерацию на flatArray, чтобы найти то, что вы хотите:

for person in flatArray {
    if person.name == "Masha" {
        // Do something
    }
}

Вы даже можете пойти дальше, используя Swift 2.0, потому что он позволяет поместить предложение where в for:

for person in flatArray where person.name == "Masha" {
    // Do something
}

Ответ 3

Вот техника, которая называется "Цепочка"

Детская площадка. Swift 3.1

import UIKit

class Person {
    var name = ""
    var lastName = ""
    var age = 0
}

var person1 = Person()
person1.name = "Joe"
person1.lastName = "Doe"
person1.age = 21

var person2 = Person()
person2.name = "Julia"
person2.lastName = "Ivanova"
person2.age = 22

var person3 = Person()
person3.name = "Irina"
person3.lastName = "Petrova"
person3.age = 25

var person9 = Person()
person9.name = "Vova"
person9.lastName = "Vovin"
person9.age = 32

var person10 = Person()
person10.name = "Masha"
person10.lastName = "Golovanova"
person10.age = 20

var person11 = Person()
person11.name = "Petra"
person11.lastName = "Andreeva"
person11.age = 27

var array = [[person1, person2, person3], [person9, person10, person11]]

array
    .flatMap{$0}
    .forEach { (anyPerson:Person) in

        if anyPerson.name == "Masha" {
            //Do what you need
            print(anyPerson.lastName)
        }
}

Экран с детской площадки: enter image description here

Ответ 4

Итерация может выполняться как в ответе @Rachel. Однако есть разные способы сделать одно и то же, а не обязательно путем итерации - и в некоторых случаях только с одной строкой кода.

Если вы хотите найти, лучший способ - использовать метод массива filter, но до этого многомерный массив должен быть сплющен, используя flatMap.

Итак, чтобы найти первый элемент с определенным именем, вы можете просто сделать:

let result: Person? = array.flatMap { $0 }.filter { $0.name == "Masha" }.first

Ответ 5

swift 3:

 forEach({element in
   // do what you need
 })

Ответ 6

Вот довольно простой способ сделать то, что вам нужно:

let result = array
    .flatMap { $0 }
    .first(where: { $0.name == "Masha" })

Сначала вам нужно сделать свой массив плоским, а затем вы можете просто получить первый элемент из массива, который удовлетворяет заданному предикату (в нашем случае, где name равно "Masha").