【问题标题】:How to iterate through array of objects in Swift?如何遍历 Swift 中的对象数组?
【发布时间】:2015-10-17 14:21:18
【问题描述】:

我有对象

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]]

如何遍历数组以获取例如 name="Masha" 的人

提前致谢

【问题讨论】:

标签: arrays swift for-loop multidimensional-array


【解决方案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
        }
    }
}

【讨论】:

  • 如果我有“N”次嵌套数组怎么办。然后呢?
【解决方案2】:

可以像@Rachel 的回答那样进行迭代。然而,有不同的方法可以做同样的事情,不一定是通过迭代——在某些情况下只需要一行代码。

如果你想找到,那么最好的方法是使用数组的filter 方法——但在此之前,多维数组应该被展平,使用flatMap

因此,要找到具有特定名称的第一个元素,您可以简单地执行以下操作:

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

【讨论】:

【解决方案3】:

解决这个问题的一个有趣方法是利用 Swift 的 flatMap 函数。

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 更进一步,因为它允许您在 for 中放置 where 子句:

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

【讨论】:

    【解决方案4】:

    这是一种叫做“链式”的技术

    游乐场斯威夫特 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)
            }
    }
    

    游乐场的屏幕截图:

    【讨论】:

    • 快速谷歌并没有在forEach上找到官方文档。我确实发现一些博客提到编写扩展以将 forEach 添加到 Array。你能指出一些关于 forEach 的文件吗?提前致谢。
    • @LiweiZ 1. 数组符合'SequenceType'协议。文档:link 2. 在 Playground 或 Xcode -> 按住 'cmd' + 将鼠标悬停到 .forEach 方法并单击鼠标。
    • @AlexeyBondarchuk 感谢您的回复。赞成您的回答和评论。
    【解决方案5】:

    斯威夫特 3:

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

    【讨论】:

    • 获取 Person 的向量,所以需要另一个 for 循环
    【解决方案6】:

    这是一种非常简单的方法来满足您的需求:

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

    首先,您必须使数组变平,然后您可以从数组中获取满足给定谓词的第一个元素(在我们的例子中,name 等于 "Masha")。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 2020-12-03
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      相关资源
      最近更新 更多