17

Swift では、辞書の配列を 1 つの辞書にフラット化しようとしています。

let arrayOfDictionaries = [["key1": "value1"], ["key2": "value2"], ["key3": "value3", "key4": "value4"]]


//the end result will be:   
 flattenedArray = ["key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4"]

flatmap を使用してみましたが、返される結果の型はieでは[(String, AnyObject)]ありません[String, Object]

let flattenedArray = arrayOfDictionaries.flatMap { $0 }
// type is [(String, AnyObject)]

だから私は2つの質問があります:

  • タイプ [(String, AnyObject)] が返されるのはなぜですか? そして、括弧は何を意味しますか?

  • 望ましい結果を得るにはどうすればよいですか?

編集: for ループの代わりに、Swift の map/flatmap/reduce などで機能的なアプローチを使用することをお勧めします

4

4 に答える 4

18

括弧は何を意味しますか?

これは、コロンの代わりにコンマとともに、最初の手がかりを提供するはずです。括弧は、タプルの配列を取得することを意味します。配列ではなくディクショナリを探しているため、タプル (キーと値のペア) のシーケンスを単一のディクショナリに変換する必要があることがわかります。

望ましい結果を得るにはどうすればよいですか?

それを行う 1 つの方法はreduce、次のように を使用することです。

let flattenedDictionary = arrayOfDictionaries
    .flatMap { $0 }
    .reduce([String:String]()) { (var dict, tuple) in
        dict.updateValue(tuple.1, forKey: tuple.0)
        return dict
    }
于 2016-02-24T09:45:38.040 に答える
1

ここに方法があります

let arrayOfDictionaries = [["key1": "value1"], ["key2": "value2"], ["key3": "value3", "key4": "value4"]]
var dic = [String: String]()
for item in arrayOfDictionaries {
    for (kind, value) in item {
        print(kind)
        dic.updateValue(value, forKey: kind)
    }


}
print(dic)

print(dic["key1"]!)

出力

出力

于 2016-02-24T09:44:49.543 に答える