[Swift] ネストした辞書の中身を書き換える

Swiftの辞書は値型だそうです。
辞書の中に辞書や配列をネストして入れている場合に、中身を書き換える方法について調べました。
(もっといい方法があったら教えて欲しいです...)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 辞書の中の深い部分を書き換える方法
 
typealias DeepHash = [String: [String: [String]]]
 
func changeDeepHash(_ dict: inout DeepHash) {
    // Apple のcountを["100", "200", "300"]に変えたい
 
    // 上から順に更新したものでアップデートしていく
    if var apple = dict["Apple"] {
        if var count = apple["count"] {
            count.append("300")
            apple["count"] = count
        }
        dict["Apple"] = apple
    }
}
 
let original: DeepHash = [
    "Apple":  ["color": ["red", "green"],    "count": ["100", "200"]],
    "Orange": ["color": ["orange", "green"], "count": ["10", "20"]]
    ]
 
print(original)
var copy = original
changeDeepHash(©)
 
print(original)
print(copy)

辞書から取り出した物が辞書で、その中を書き換えても元の辞書の中身は書き変わりません。
書き換える場合は、更新した物で元の辞書を更新する必要があります。
for inout v in dict みたいな文法がサポートされるまではこんな感じで更新するしかないようです。

より良い方法があれば教えて欲しいです。

0 件のコメント :

コメントを投稿