2016-06-09 2 views
1

Ich weiß, dass dies zuvor beantwortet worden sein könnte, aber ich konnte nichts finden, wenn ich suchte.Entfernen Element innerhalb eines Arrays, das ist der Wert in einem Wörterbuch Swift 2

So habe ich ein Wörterbuch, das wie folgt aussieht:

var dict = [String:[String]]() 

Was innerhalb des Arrays einen bestimmten Index zu entfernen, die ich tun möchte (der Wert des Wörterbuch). Angenommen, ich möchte die Zeichenfolge "Stuhl" aus diesem Code entfernen:

Entschuldigung, wenn dies bereits beantwortet wurde.

Antwort

1

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"]]   */ 
+0

Genau das, was ich brauchte. Vielen Dank! –

+0

@MarkusJohansson glücklich zu helfen. – dfri

0
guard var furniture = dict["Furniture"] else { 
    //oh shit, there was no "Furniture" key 
} 
furniture.removeAtIndex(1) 
dict["Furniture"] = furniture 
1

Wenn Sie bestimmte Element entfernen möchten, können Sie dies tun:

var dict = ["Furniture": ["Table", "Chair", "Bed"], "Food": ["Pancakes"]] 

extension Array where Element: Equatable { 
    mutating func removeElement(element: Element) { 
     if let index = indexOf ({ $0 == element }) { 
      removeAtIndex(index) 
     } 
    } 
} 

dict["Furniture"]?.removeElement("Chair") //["Furniture": ["Table", "Bed"], "Food": ["Pancakes"]]