How to iterate through array of objects in Swift?

后端 未结 6 807
慢半拍i
慢半拍i 2021-02-01 02:24

i have objects

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

var person2 = Person()
person2.name = \"Julia\"
person2         


        
相关标签:
6条回答
  • 2021-02-01 02:58

    Here is technique which called 'Chaining'

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

    Screen-shot from playground:

    0 讨论(0)
  • 2021-02-01 03:04

    Here is a pretty simple way to do what you need:

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

    First you have to make your array flatted and then you can just get the first element from the array that satisfies the given predicate (in our case, where name is equal to "Masha").

    0 讨论(0)
  • 2021-02-01 03:07

    I would try this:

    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
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-01 03:16

    An interesting way of solving this would be to leverage the flatMap function of Swift.

    var array = [[person1, person2, person3], [person9, person10, person11]]
    
    let flatArray = array.flatMap { $0 }
    

    flatArray now is [person1, person2, person3, person9, person10, person11] of type Array<Person>.

    Then you can iterate on flatArray to find what you want :

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

    You could even go further by using Swift 2.0 because it allows you to put a where clause in the for :

    for person in flatArray where person.name == "Masha" {
        // Do something
    }
    
    0 讨论(0)
  • 2021-02-01 03:20

    Swift 3:

    forEach({ element in
      // do what you need
    })
    
    0 讨论(0)
  • 2021-02-01 03:25

    Iterating can be done as in @Rachel's answer. However there are different ways of doing the same thing, and not necessarily by iterating - and in some cases with just one line of code.

    If you want to find, then the best way is using the array's filter method - but before that the multi dimensional array should be flattened, using flatMap.

    So, to find the first element having a certain name, you can simply do:

    let result: Person? = array.flatMap { $0 }.filter { $0.name == "Masha" }.first
    
    0 讨论(0)
提交回复
热议问题