2017-02-08 4 views
0

Ich habe eine Reihe von Posts beim Durchlaufen eines Wörterbuchs gesehen, aber sie sind meiner Meinung nach anders und einfacher als das, was ich hier erreichen möchte. Ich habe folgende Felder:Wie kann ich einen bestimmten CGPoint aus einem Wörterverzeichnis entfernen?

pt1.array = [0:[pt2.point], 
      1:[pt8.point, pt12.point, pt4.point], 
      2:[pt20.point, pt14.point, pt3.point], 
      3:[pt7.point, pt8.point, pt9.point]] 
pt2.array = [0:[pt5.point], 
      1:[pt8.point, pt11.point, pt1.point], 
      2:[pt10.point, pt9.point, pt3.point], 
      3:[pt6.point, pt1.point, pt4.point]] 
pt3.array = [0:[pt13.point], 
      1:[pt1.point, pt15.point, pt7.point], 
      2:[pt19.point, pt14.point, pt2.point], 
      3:[pt10.point, pt11.point, pt12.point]] 
pt4.array = [0:[pt8.point], 
      1:[pt9.point, pt11.point, pt13.point], 
      2:[pt14.point, pt15.point, pt6.point], 
      3:[pt3.point, pt2.point, pt1.point]] 
pt5.array = [0:[pt18.point], 
      1:[pt8.point, pt6.point, pt1.point], 
      2:[pt3.point, pt17.point, pt4.point], 
      3:[pt16.point, pt15.point, pt14.point]] 

allPoints = [pt1, pt2, pt3, pt4, pt5] 

Wie kann ich iterieren pt3.point zu entfernen, die eine CGPoint aus allen Int-[CGPoint] Wörterbücher der allPoints Array?

versuchte ich folgendes:

for pt in allPoints { 
    for ptArrIndex in pt.arrays { 

     for (key, value) in ptArrIndex { 
      //remove point from dict here 
     } 
    } 
} 

aber ich habe den Fehler:

Type '(key: Int, value:[CGPoint])' (aka'(key: Int, value: Array<CGPoint>)') does not conform to protocol 'Sequence' 

an der Linie:

for (key, value) in ptArrIndex { 

EDIT

Die Struktur, die jeden der Punkte erstellt unter:

struct Point { 
    var point: CGPoint 
    var arrays: [Int: [CGPoint]] 
} 

AKTUALISIERT FRAGE

Basierend auf Rob Napier Vorschlag ich die Frage aktualisiert haben:

Ich habe eine Struktur unter:

struct Location { 
    var point: CGPoint 
    var changedLoc: [Int: [CGPoint]] 
} 

wo point ein CGPoint fürdarstelltund changedLoc repräsentiert alle möglichen Gruppen von CGPoints Location können geändert werden. Ich berechne das zufällig.

Ich habe folgende Standorte

var location1 = Location(point: initialBallPosition, changedLoc: [0: [CGPoint(x: 421.0, y: 43.0), CGPoint(x: 202.0, y: 69.0)], 1: [CGPoint(x: 121.0, y: 198.0)]]) 
var location2 = Location(point: initialBallPosition, changedLoc: [0: [CGPoint(x: 421.0, y: 43.0), CGPoint(x: 123.0, y: 254.0)], 1: [CGPoint(x: 90.0, y: 104.0)]]) 

var allLocations = [location1, location2] 

Von allLocations wie kann ich den Punkt entfernen CGPoint(x: 421.0, y: 43.0) die sowohl location1 und location2changedLoc ist?

+0

Die Wörterbücher sehen nicht wie '[Int: CGPoint]' aus, sondern '[Int: [CGPoint]]'. –

+0

@ IvensDenner Ich aktualisierte die Frage mit dem, was ich ausprobiert habe – OnlyCodeMatters

+0

kann mir jemand helfen :) – OnlyCodeMatters

Antwort

2
func locationsRemoving(changedLoc removePoint: CGPoint, from locations: [Location]) -> [Location] { 
    return locations.map { location in 
     var changedLoc: [Int: [CGPoint]] = [:] 
     for (key, values) in location.changedLoc { 
      changedLoc[key] = values.filter{ $0 != removePoint } 
     } 
     return Location(point: location.point, changedLoc: changedLoc) 
    } 
} 

let removePoint = CGPoint(x: 421.0, y: 43.0) 
print(allLocations) 
print(locationsRemoving(changedLoc: removePoint, from: allLocations)) 
+0

Danke. Was passiert, wenn ein 'removePoints' Array von' CGPoints' entfernt werden soll? – OnlyCodeMatters

+0

Aktivieren Sie dann 'removePoints.contains ($ 0)' anstelle von '! ='. (Stellen Sie sicher, dass Sie verstehen, was jede Zeile dieses Codes tut; es soll einfach sein; wenn Sie nicht genau wissen, wie es funktioniert, studieren Sie weiter und stellen Sie Fragen, bis Sie wissen, wie man es pflegt; kopieren Sie nicht einfach es.) –

0

Die verwirrende Sache, die Sie haben, ist, dass die Eigenschaft array in den ptN Instanzen benannt ist eigentlich ein Dictionary<Int, [CGPoint]>

Also, für die Struktur, die Sie derzeit haben, müssen Sie Ihren Code ändern entsprechen:

for pt in allPoints { 
    for (key, ptArray) in pt.array { 
     for elem in ptArray { 
      //remove point from dict here 
     } 
    } 
} 
+0

Vielen Dank. Ich versuche einen Weg zu finden, den Punkt zu entfernen. Anstelle des Kommentars habe ich 'if elem == pt3.point { ptArray.remove (at: ptArray.index (von: elem)) }' aber dies gibt mir den Fehler 'Kann nicht mutierende Mitglied auf unveränderlichen Wert verwenden: 'ptArray' ist eine 'Let'-Konstante', die ich verstehe. Nur, dass ich nicht sicher bin, wie ich den Punkt aus 'ptArray' entfernen werde – OnlyCodeMatters

+0

Statt' ptArray' zu iterieren, könntest du versuchen: 'pt.array = ptArray.filter {$ 0! = Pt3.point}'. Dazu müsste 'array' als' var' deklariert werden. –

+0

Ich frage mich allerdings, ob dies der richtige Weg ist. Möchtest du etwas von dem größeren Bild von dem, was du erreichen willst, teilen? –

Verwandte Themen