データペイロードを組み立ててGRMustache.swiftに渡すと、ひげ模様テンプレートがレンダリングされます。以前に辞書で定義した配列にデータを追加する必要があります。[String:Any]ディクショナリ構造体に配列に追加する
私のデータ構造としてオフ開始します。
var data: [String: Any] = [
"key1": "example value 1",
"key2": "example value 2",
"items": [
// I need to append here later
]
]
items
鍵のペアは、私はループ内で、後で追加する必要がありますコレクションです。タイプAny?
の値がまったくメンバーappend
を持っていない、と二項演算子+=
はタイプのオペランドに適用することができないよう、
for index in 1...3 {
let item: [String: Any] = [
"key": "new value"
]
data["items"].append(item)
}
このエラーAny?
:data["items"]
アレイに追加するには
、私のような何かをしようとしていますおよび[String : Any]
。
追加する値をキャストする必要があるため、これは意味があります。しかし、配列を突然変異させることはできません。 ;私のキャストは間違っているよう
(data["items"] as! Array).append(item)
'Any?' is not convertible to 'Array<_>'; did you mean to use 'as!' to force downcast?
Cannot use mutating member on immutable value of type 'Array<_>'
は思える:意気消沈を強制的にエラーを与えるかどうか、配列にキャスト
または、おそらく私は間違った方法でこれについて行くつもりです。
時間の経過とともに反復的にdata["items"]
を記入する方法に関する推奨事項はありますか?
@JasonSturgesこれを追加することができ、私は問題とどこができた何をちょうど示しているがあります与えます辞書の中にあった配列を直接追加します。 –
'[String:[[String:Any]]]型の明快さと優雅さを本当に感謝します。 –
上記の 'data [" items "]!append(item)'ではなく、 'data [" items "]?append(item)'を使うことができます。後者は '' items ''キーの値がなくても(この例にあるとわかっていても)、ランタイムクラッシュを引き起こしますが、前者は単純に未使用の' nil'を返します。私たちが存在する "アイテム"の鍵を知っていても、特に余分なコストがかからない場合には、安全なアプローチを選ぶべきだと思う。初心者のSO読者のために、この特定の事例/例では '!'が安全であることを認識しない悪い '!'練習を強化するリスクは常にありますが、それ以外の場合は一般的ではありません。 – dfri