2017-01-30 5 views
0

ich ein Problem mit Löschen des Elements haben von Array ich versuche es lange Zeit zu lösen, aber ich konnte nichtProbleme mit Lösch Element in Array mit schnellen 3

mein Problem ist: ich habe Wörterbuch [Int: String] welche enthalten Elemente die Benutzer wählen, diese Elemente aus der Tabellenansicht Zelle für sie nach dem löschen dieses Wörterbuch hat ein Element aus Typ String und mit Schlüssel Schlüsseln ist indexPath.row folgender mein Wörterbuch Code:

var dictionaryOfItems = [Int:String]() 
dictionaryOfItems.updateValue("Banana", forKey: 0) 
dictionaryOfItems.updateValue("Cucumber", forKey: 3) 

und ich habe ein Array, das Array von Elementtyp String enthält die f Code ach ist mein Array:

var array :[String] = ["Banana","Apple","Orange","Cucumber","lettuce","Milk","Tea"] 

ich brauche Elemente aus Array zu löschen, die dictionarOfItems es

enthalten ist, wenn ich versuche, die Elemente aus Array löschen i die Fehlermeldung Index off Bereich bekommen, wie kann ich das beheben bitte

folgende ist mein voller Code:

var array :[String] = ["Banana","Apple","Orange","Cucumber","lettuce","Milk","Tea"] 

var dictionaryOfItems = [Int:String]() 
dictionaryOfItems.updateValue("Banana", forKey: 0) 
dictionaryOfItems.updateValue("Cucumber", forKey: 3) 


for (index,_) in dictionaryOfItems { 
    if array[index] == dictionaryOfItems[index] { 
     array.remove(at: index) 
    } 
} 
+0

Ich sehe keine Fehlermeldung. Es löscht "Banana" korrekt aus dem Array. Beachten Sie auch, dass sich jedes Mal, wenn Sie etwas löschen, die Indizes verschieben, so dass nach dem Löschen von "Banana" '" Cucumber "sich beim Index" 2 "befindet und daher bei der nächsten Iteration nicht gelöscht wird. – Keiwan

+0

Ja ich weiß, dass das Array ist es verschieben diese nur löschen Banane von Array und was ist mit dem zweiten Element ist es ist es nicht delet, wie kann ich dieses Problem lösen – Mustafa

Antwort

0

Statt explizit Element aus dem Array entfernen, können Sie einfach filter mit einem Prädikat:

  • unsere Elemente, deren zugehörige Array-Index Filtern (zB idx) entspricht einem Schlüssel in Ihnen dictionaryOfItems, deren Wert gleich dictionary das des Array-Elements.

Z. B .:

array = array.enumerated() 
    .filter { (idx, _) in dictionaryOfItems[idx] != array[idx] } 
    .map { $0.1 } 
print(array) // ["Apple", "Orange", "lettuce", "Milk", "Tea"] 

Es scheint wie ein ganz Umwegen, aber; Verwenden Sie ein Wörterbuch, um das Element "all-changing" Indizes in Ihrem veränderbaren Array zu verfolgen (dies ist insbesondere der Grund für Ihren Laufzeitfehler). Sind Sie sicher, dass ein Dictionary Indizes und Elemente in einem Array verfolgen soll, wobei letzteres inhärent eine Sammlung von Elementen und zugehörigen Indizes ist?

Auf einer anderen Anmerkung, wenn Ihr Prädikat ist in der Tat einfacher (entfernt nur Artikel, die als Werte vorhanden sind in einem Wörterbuch, ohne die Notwendigkeit von Ketten Indizes), können Sie einen viel einfacheren filter Ansatz verwenden:

array = array.filter { !dictionaryOfItems.values.contains($0) } 
print(array) // ["Apple", "Orange", "lettuce", "Milk", "Tea"] 
+0

Vielen Dank mein Freund es ist Arbeit – Mustafa

0

Try this:

var array :[String] = ["Banana","Apple","Orange","Cucumber","lettuce","Milk","Tea"] 

var dictionaryOfItems = [Int:String]() 
dictionaryOfItems.updateValue("Banana", forKey: 0) 
dictionaryOfItems.updateValue("Cucumber", forKey: 3) 

var indexes = dictionaryOfItems.keys.sorted().reversed() 

for index in indexes { 
    if array[index] == dictionaryOfItems[index] { 
     array.remove(at: index) 
    } 
} 
+0

Sie vielen Dank mein Freund, es ist Arbeit – Mustafa

Verwandte Themen