2016-12-04 63 views
4

以下類在其中包含一些變量。在類數組中合併數組

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

var allPeople = [Person]() 
var allItems = [String]() 

假設我們創建初始化爲類和allPeople中有n元素,我想每個對象的所有項目合併成一個新的數組

問題是當我試圖訪問每個索引的allPeople,然後從那裏獲取項目變量並將其附加到allItems。但是我需要指定一個根據元素總數而變化的數字。我最初的嘗試是使用for循環。還使用allPeople[allPeople.count - n],類似於此。

+2

怎麼樣'let allItems = allPeople.flatMap {$ 0.items}'? – sbooth

+0

您並未將它們添加/附加在一起。雖然很好地使用了'flatmap'。我正在使用'map'這是不正確的... – Honey

+0

請描述你想要達到的目標,你嘗試過什麼以及目前的結果(問題)是什麼。 – shallowThought

回答

4

解決方法1(這是swiftiest方式):

//if you want to keep adding to the old array 
allItems += allPeople.flatMap{$0.items} 

//if you want to add into a new array 
let newArray = allItems + allPeople.flatMap{$0.items} 

// Using 'map' won't work: 
allItems = allItems + allPeople.map{$0.items} //error: binary operator '+' cannot be applied to operands of type '[String]' and '[[String]]' 

上面的代碼不工作,因爲我們正在增加[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] 

據內部印刷陣列陣列。所以我們需要再做一步。

let mapped = allPeople.map{$0.items} 

print(Array(mapped.joined())) // ["a", "b", "c", "d", "e", "f"] 

所以,如果我們要使用map,我們也應該用joined

溶液2(不是很SWIFTY但我只是想多解釋flatMap基本上是一個join + map

let newJoinedMappedArray = allItems + Array(allPeople.map($0.items).joined()) 
+0

正是我在找的東西,如果我能爲你投票10次我會的!感謝您的詳細解答 – Christian

0

嘗試了這一點

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

我不知道如果我理解您的具體問題是什麼,但如果你只是想一切allPeople所有Person對象的item陣列附加到allItems即可簡單地做:

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