Как перебирать массив объектов в 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= "Маша"
заблаговременно
Ответы
Ответ 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"
).