web-dev-qa-db-de.com

Wie man durch ein Array von Objekten in Swift iteriert?

ich habe Gegenstände

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

und Multi Array

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

wie kann ich durch Array iterieren, um zum Beispiel eine Person mit name = "Masha"

danke im Voraus

31
Alexey K

Ich würde das versuchen:

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
        }
    }
}
57
Rachel Harvey

Ein interessanter Lösungsweg wäre die Nutzung der flatMap-Funktion von Swift.

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

let flatArray = array.flatMap { $0 }

flatArray ist jetzt [person1, person2, person3, person9, person10, person11] vom Typ Array<Person>.

Dann können Sie auf flatArray iterieren, um das zu finden, was Sie möchten: 

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

Mit Swift 2.0 können Sie sogar noch einen Schritt weiter gehen, da Sie hier eine where-Klausel in die for -Datei einfügen können: 

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

Hier ist eine Technik, die "Verkettung" genannt wird.

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

Screenshot vom Spielplatz:  enter image description here

15

Iteration kann wie in @ Rachel's Antwort erfolgen. Es gibt jedoch verschiedene Möglichkeiten, dasselbe zu tun, und zwar nicht notwendigerweise durch Iteration - und in einigen Fällen mit nur einer Codezeile.

Wenn Sie suchen möchten, verwenden Sie am besten die filter-Methode des Arrays. Vorher sollte das mehrdimensionale Array jedoch mit flatMap reduziert werden. 

Um das erste Element mit einem bestimmten Namen zu finden, können Sie einfach Folgendes tun:

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

Swift 3:

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

Hier ist eine ziemlich einfache Möglichkeit, das zu tun, was Sie brauchen:

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

Zuerst müssen Sie Ihr Array flatt machen und dann können Sie einfach das erste Element aus dem Array erhalten, das das angegebene Prädikat erfüllt (in unserem Fall ist name gleich "Masha").

1
xcocoader