在Swift中如何遍历对象数组?

35

我有物品

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

我该如何遍历数组以获取例如名称为 "Masha" 的人?

提前感谢。


可能是如何在Swift中循环遍历对象数组的重复问题。 - Cœur
6个回答

66

我会尝试这样做:

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”次嵌套的数组,那么呢? - Lakshmi Yadav

21

利用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
}

18

这里介绍一种名为“链式编程”的技巧

PlaygroundSwift 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)
        }
}

游乐场截图: 输入图像描述


1
快速谷歌搜索并没有找到关于forEach的官方文档。我发现一些博客提到编写扩展以将forEach添加到数组中。您能否指出一些关于forEach的文档?先感谢您了。 - LiweiZ
1
  1. 数组符合'SequenceType'协议。 文档:链接
  2. 在playground或Xcode中->按住'cmd' + 悬停鼠标到.forEach方法并进行鼠标点击。
- Alexey Bondarchuk
@ AlexeyBondarchuk 感谢您的回复。我已经点赞了您的回答和评论。 - LiweiZ

10

可以像 @Rachel 的回答中那样进行迭代。但是完成相同任务的方式有很多种,并且不一定是通过迭代 - 在某些情况下只需要一行代码。

如果你想要查找,最好的方法是使用数组的 filter 方法 - 但在此之前,需要使用 flatMap 将多维数组展平。

因此,要查找具有特定名称的第一个元素,你可以简单地执行:

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

谢谢!我以前从未遇到过构造函数 { $0 }。该如何向谷歌提问以了解更多信息? - Alexey K
@AlexeyK 在 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID95 中搜索简写参数名称。 - Fantattitude
这是一个闭包语法简化 - 它使用参数类型推断、简写参数名称和隐式返回的尾随闭包。请阅读闭包表达式 - Antonio

9

Swift 3:

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

需要另一个for循环来获取Person向量。 - mmmmmm

3
这里有一个非常简单的方法来完成您所需的操作:
let result = array
    .flatMap { $0 }
    .first(where: { $0.name == "Masha" })

首先,您需要将数组展平,然后只需从满足给定谓词的数组中获取第一个元素(在我们的情况下,name等于"Masha")。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接