Append to array [String: Beliebig] dictionary-Struktur
Montage einen Daten-payload übergeben GRMustache.swift für die Darstellung Schnurrbart Vorlagen, ich bin in einem Szenario, wo muss ich Anhängen von Daten an ein array vorher definiert im Wörterbuch.
Meine Daten-Struktur beginnt wie:
var data: [String: Any] = [
"key1": "example value 1",
"key2": "example value 2",
"items": [
//I need to append here later
]
]
Den items
key-pair-Mädchen ist eine Sammlung muss ich anfügen, später in einer Schleife.
Hinzufügen data["items"]
array, ich versuche so etwas wie:
for index in 1...3 {
let item: [String: Any] = [
"key": "new value"
]
data["items"].append(item)
}
Dieser Fehler, als Wert vom Typ Any?
hat kein Mitglied append
- und binary-operator +=
angewendet werden kann nicht auf Operanden vom Typ Any?
und [String : Any]
.
Dies macht Sinn, da muss ich cast den Wert Anhängen, aber ich kann nicht mutieren array.
Umwandlung in array, egal ob zwingen niedergeschlagenen gibt den Fehler:
(data["items"] as! Array).append(item)
'Any?' nicht konvertierbar 'Array<_>'; meinst du mit 'so!' und Kraft niedergeschlagen?
Nicht verwenden mutierend Mitglied auf unveränderlichen Wert vom Typ 'Array<_>'
Scheint, wie meine Besetzung ist falsch; oder, vielleicht werde ich über diese in der falschen Art und Weise.
Jede Empfehlung zum ausfüllen data["items"]
iterativ über die Zeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Typ der
data[Items]
ist nichtArray
aber eigentlichArray<[String: Any]>
.Wahrscheinlich könnte man drücke diese in weniger Schritte, aber ich bevorzuge die Klarheit der mehrere Schritte:
subscript
mitDictionary
immer wiederoptional(?)
Beispiel, weil es vielleicht möglich, dasskey
ist nicht vorhanden inDictionary
. Jetzt müssen Sie erklären, Ihr Wörterbuch als[String:Any]
bedeutet Art derkey
istString
undvalue
istAny
.Nun, wenn Sie schreiben
data["item"]
es zurückAny?
das ist kein Array, so dass Sie kann nicht aufgerufenappend
und es erfolgt die Rückkehr unveränderlich Wert, so können Sie nicht direkt mutieren Sie.So müssen Sie die Typumwandlung es zu zahlreichen Dictionary gespeichert und es auf die Instanz, und fügen Sie, dass die Instanz danach ersetzen Sie das Objekt in Ihrem Wörterbuch mit Neuzuweisen es.
Nun Sache ist viel einfacher, wenn Sie
Dictionary
wie[String: [[String:Any]]]
für zB.[String: [[String: Any]]]
eingeben.data["items"]?.append(item)
eher alsdata["items"]!.append(item)
oben; letztere ergeben eine Laufzeit zum Absturz bringen, wenn es geschieht, um keinen Wert für den"items"
- Taste (auch wenn wir wissen, dass es in diesem Beispiel), in der Erwägung, dass der ehemalige, schicken Sie einfach eine ungenutztenil
. Auch wenn wir wissen, dass die"items"
Schlüssel zu existieren, ich glaube, wir sollten lieber das sichere Ansatz, vor allem, wenn es kommen keine extra Kosten. Immer die Gefahr einer Verstärkung der schlechten!
Praxis für Anfänger, DAMIT die Leser, die nicht erkennen, dass in diesem speziellen Fall/Beispiel!
ist sicher, aber sonst, ist in der Regel nicht.Wenn Sie es vorziehen Kürze mehr Klarheit, können Sie durch ausführen dieser operation in einer einzigen Zeile, so dass das
nil
- coalescing-operator und die+
- operator fürRangeReplaceableCollection
(zu denenArray
entspricht), wobei letztere für die "append" - Schritt (in der Tat den Bau einer neuen Kollektion, die das ersetzen der vorhandenen ersetzen, wenn der Wert derdata["items"]
).Geben Sie eine
Array
vonitems:[String]
Kann er auch in den json -