2016-12-04 4 views
4

Die folgende Klasse enthält einige Variablen.Zusammenführen von Arrays innerhalb eines Arrays der Klasse

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

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

Angenommen, wir initializers für die Klasse erstellt und allPeople hat n Elemente drin, würde Ich mag alle Elemente für jedes Objekt in ein neues Array verschmelzen

Das Problem kommt, wenn ich versuche, jeden Index für den Zugriff auf von allPeople, und von dort, erhalten Sie die Elemente Variable und fügen Sie es an allItems. Aber ich muss eine Zahl angeben, die sich entsprechend der Gesamtzahl der Elemente ändert. Mein erster Versuch war, eine for-Schleife zu verwenden. Auch mit allPeople[allPeople.count - n], etwas ähnliches.

+2

Was ist mit 'let allItems = allPeople.flatMap {$ 0.items} '? – sbooth

+0

Du fügst/fügst sie nicht zusammen an. Obwohl gute Verwendung von 'Flatmap'. Ich habe 'map' verwendet, was falsch war ... – Honey

+0

Bitte beschreiben Sie, was genau Sie erreichen wollen, was Sie versucht haben und was das aktuelle Ergebnis (Problem) ist. – shallowThought

Antwort

4

solution1 (dies ist die swiftiest Fahrt):

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

Der obige Code funktioniert nicht, weil wir [String]]-[String] hinzufügen, die die + weiß nicht, wie zu handhaben, zu lesen:

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] 

Es ist Arrays Druck innerhalb Arrays. Also müssen wir noch einen Schritt machen.

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

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

so, wenn wir map verwenden wollen, sollten wir auch joined

Solution2 verwenden (nicht sehr swifty aber ich wollte nur erklären, dass ein flatMap ist im Grunde eine join + map)

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

Genau das, was ich gesucht habe, wenn ich Sie 10 mal abstimmen könnte, würde ich! Vielen Dank für Ihre ausführliche Antwort – Christian

0

dies ausprobieren

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

Ich bin mir nicht sicher, ob ich verstanden, was Ihre genaue Problem ist aber, wenn man nur alle die item Arrays aller in allPeoplePerson Objekte wollen allItems angehängt werden können Sie einfach tun:

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