Struct Array から Dictionaryに変換処理(メモ)
1。reduce を利用し、変換
reduce(::)
指定されたクロージャを使用してシーケンスの要素を組み合わせた結果を返します。
func reduce<Result>(_ initialResult: Result,
_ nextPartialResult: (Result, Element) throws -> Result)
rethrows -> Result
code
items.reduce([String: Item]()) { (dic, item) in
var resultDic = dic
resultDic[item.id] = item
return resultDic
}
結果 [String, Item]
["3": Item(id: "3", title: "title3"),
"1": Item(id: "1", title: "title1"),
"2": Item(id: "2", title: "title2")]
2。Dictionary(uniqueKeysWithValues:) を利用し、変換①
init(uniqueKeysWithValues:)
指定された順序でキーと値のペアから新しい辞書を作成します。
//Creates a new dictionary from the key-value pairs in the given sequence.
init<S>(uniqueKeysWithValues keysAndValues: S)
where S : Sequence, S.Element == (Key, Value)
init(uniqueKeysWithValues:) Developer Document
code
Dictionary(uniqueKeysWithValues: items.map { item in
(item.id, items.filter { $0.id == item.id }.first)
})
結果 [String, Item?]
["2": Optional(Item(id: "2", title: "title2")),
"3": Optional(Item(id: "3", title: "title3")),
"1": Optional(Item(id: "1", title: "title1"))]
3。Dictionary(uniqueKeysWithValues:) を利用し、変換②
collections zip(::)
2つの基礎となるシーケンスから構築されたペアのシーケンスを作成します。
func zip<Sequence1, Sequence2>(_ sequence1: Sequence1, _ sequence2: Sequence2)
-> Zip2Sequence<Sequence1, Sequence2>
where Sequence1 : Sequence, Sequence2 : Sequence
collections zip(::) Developer Document
code
Dictionary(uniqueKeysWithValues: zip(items.map {$0.id}, items))
結果 [String, Item]
["3": Item(id: "3", title: "title3"),
"1": Item(id: "1", title: "title1"),
"2": Item(id: "2", title: "title2")]