Viele Antworten, die die Mutation von Wörterbucheinträge sind in der Regel konzentrieren sich auf die entfernen Wert decken -> mutieren Wert -> ersetzen Wert Idiom, aber beachten Sie, dass die Entfernung nicht eine Notwendigkeit. Sie können ebenfalls eine In-Place-Mutation unter Verwendung z.B. optional Verkettungs
dict["Furniture"]?.removeAtIndex(1)
print(dict)
/* ["Furniture": ["Table", "Bed"],
"Food": ["Pancakes"]] */
ist jedoch zu beachten, dass die .removeAtIndex(...)
-Lösung nicht ganz sicher ist, wenn Sie ein Array-Grenzen überprüfen, um sicherzustellen, führen, dass der Index für die wir tatsächlich existiert ein Element zu entfernen versuchen.
Als sicher in-place-Mutation Alternative, verwenden Sie die where
Klausel einer optionalen verbindliche Aussage der den Index wir außerhalb der Grenzen entfernen möchten zu überprüfen, nicht
let removeElementAtIndex = 1
if let idxs = dict["Furniture"]?.indices where removeElementAtIndex < idxs.endIndex {
dict["Furniture"]?.removeAtIndex(removeElementAtIndex)
}
Eine weitere sichere Alternative ist die Nutzung von advancedBy(_:limit)
, um einen sicheren Index zur Verwendung in removeAtIndex(...)
zu erhalten.
let removeElementAtIndex = 1
if let idxs = dict["Furniture"]?.indices {
dict["Furniture"]?.removeAtIndex(
idxs.startIndex.advancedBy(removeElementAtIndex, limit: idxs.endIndex))
}
Schließlich, wenn mit dem Entfernen/mutieren/ersetzen Idiom, eine andere sichere Alternative ist ein Mutieren flatMap
für den Schritt unter Verwendung ein Element für eine gegebene Index entfernen, wenn dieser Index in dem Array vorliegt. Zum Beispiel für einen generischen Ansatz (und where
Klausel Missbrauch :)
func removeSubArrayElementInDict<T: Hashable, U>(inout dict: [T:[U]], forKey: T, atIndex: Int) {
guard let value: [U] = dict[forKey] where
{() -> Bool in dict[forKey] = value
.enumerate().flatMap{ $0 != atIndex ? $1 : nil }
return true }()
else { print("Invalid key"); return }
}
/* Example usage */
var dict = [String:[String]]()
dict = ["Furniture": ["Table", "Chair", "Bed"], "Food": ["Pancakes"]]
removeSubArrayElementInDict(&dict, forKey: "Furniture", atIndex: 1)
print(dict)
/* ["Furniture": ["Table", "Bed"],
"Food": ["Pancakes"]] */
Genau das, was ich brauchte. Vielen Dank! –
@MarkusJohansson glücklich zu helfen. – dfri