Arrays 在类的数组中合并数组

Arrays 在类的数组中合并数组,arrays,swift,Arrays,Swift,下面的类中有一些变量 class Person { var age: Int = 4 var items = [String]() } var allPeople = [Person]() var allItems = [String]() 假设我们为类创建了初始值设定项,并且allPeople中有n元素,我想将每个对象的所有项合并到一个新数组中 当我试图访问allPeople的每个索引时,就会出现问题,从那里获取items变量并将其附加到allItems。但是我需要指定一

下面的类中有一些变量

class Person {
    var age: Int = 4
    var items = [String]()
} 

var allPeople = [Person]()
var allItems = [String]()
假设我们为类创建了初始值设定项,并且
allPeople
中有
n
元素,我想将每个对象的所有项合并到一个新数组中

当我试图访问
allPeople
的每个索引时,就会出现问题,从那里获取items变量并将其附加到
allItems
。但是我需要指定一个根据元素总数变化的数字。我最初的尝试是使用for循环。还可以使用与此类似的
allPeople[allPeople.count-n]

试试这个

for person in allPeople {
    for item in person.items {
        allItems.append(item)
    }
}

我不确定我是否理解您的确切问题,但如果您只想将
allPeople
中所有
Person
对象的
数组附加到
allItems
中,您只需执行以下操作:

for person in allPeople {
    allItems.append(contentsOf: person.items)
}

解决方案1(这是最快捷的方式):


上面的代码不起作用,因为我们正在将
[String]
添加到
[String]
中,
+
不知道如何处理,请阅读:

let john = Person()
john.items = ["a", "b", "c"]

let jane = Person()
jane.items = ["d", "e", "f"]

allPeople.append(john)
allPeople.append(jane)

print(allPeople.map{$0.items}) // [["a", "b", "c"], ["d", "e", "f"]] <-- [[String]] 
// and obviously can't be added to [String]
因此,如果我们想使用
map
,我们还应该使用
joined

解决方案2(不是很快,但我只是想解释一下
flatMap
基本上是一个
连接
+
映射


让allItems=allPeople.flatMap{$0.items}
怎么样?您没有将它们添加/附加在一起。尽管
flatmap
使用良好。我使用的是
map
,这是不正确的…请描述您到底想要实现什么,您尝试了什么,以及当前的结果(问题)是什么。仅供参考我编辑了我的回答我想要实现的是拥有一个数组,其中包含每个人拥有的所有对象。在此之后,我将继续显示所有订单中有多少重复的对象,例如2x收音机、7x笔、1x回形针等。每当向项目添加新对象时,当用户访问具有我正在查找的功能的特定“viewController”时,它将更新,因此它将始终更新。我尝试了所有的答案,所有的答案都是正确的。这正是我想要的,如果我能投你10票,我会的!谢谢你详细的回答
// Using 'map' won't work:
allItems = allItems + allPeople.map{$0.items} //error: binary operator '+' cannot be applied to operands of type '[String]' and '[[String]]'
let john = Person()
john.items = ["a", "b", "c"]

let jane = Person()
jane.items = ["d", "e", "f"]

allPeople.append(john)
allPeople.append(jane)

print(allPeople.map{$0.items}) // [["a", "b", "c"], ["d", "e", "f"]] <-- [[String]] 
// and obviously can't be added to [String]
let mapped = allPeople.map{$0.items}

print(Array(mapped.joined())) // ["a", "b", "c", "d", "e", "f"]
let newJoinedMappedArray = allItems + Array(allPeople.map($0.items).joined())