2016-12-04 8 views
4

次のクラスには、内部にいくつかの変数があります。クラスの配列内で配列をマージする

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]を使用して、これに似た何か。

+2

「let allItems = allPeople.flatMap {$ 0.items}」についてはどうですか? – sbooth

+0

あなたはそれらを一緒に追加/追加していません。フラットマップの使い方は良いですが。私は間違っていた '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

私は私はあなたの正確な問題が何であるかを理解している場合はわからないが、あなただけのallPeople内のすべてのPersonオブジェクトのitem配列のすべてはあなたができるallItemsに追加したい場合は

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

これを試してみてください単に実行します。

for person in allPeople { 
    allItems.append(contentsOf: person.items) 
} 
関連する問題