Array-Werte bei bestimmten Indizes austauschen?

8

Ich erstelle das asynchrone NSURLConnections für Bilder, die auf einem Array von Wörterbüchern basieren, jedes mit einer eigenen Bild-URL:

%Vor%

Angesichts der asynchronen Art der Verbindungen (was ich möchte, werden die schnellsten Bilder zuerst geladen), werden die Bilder möglicherweise in einer anderen Reihenfolge geladen, wie zum Beispiel:

%Vor%

Wenn die Bilder jedoch nicht in der richtigen Reihenfolge geladen werden, muss das ursprüngliche posts -Array entsprechend der geladenen Bilder neu organisiert werden. Im obigen Beispiel sollte posts nun wie folgt aussehen:

%Vor%

Gibt es in Swift eine Möglichkeit, Werte eines Arrays bei einem bestimmten Index mit Werten desselben Arrays bei einem anderen Index zu vertauschen? Ich habe das zuerst versucht, indem ich die Funktion swap verwendet habe:

%Vor%

Ich habe dann etwas Ähnliches ohne die Funktion swap versucht:

%Vor%

In beiden Szenarien werden die Array-Werte jedoch nicht korrekt vertauscht. Ich weiß, dass dies ein logischer Fehler ist, aber ich sehe nicht, wo der Fehler tatsächlich liegt.

Soweit ich das beurteilen kann, wird es beim ersten Mal richtig ausgetauscht, aber dann hat das neue Wörterbuch einen inkorrekten calledIndex -Wert, der bewirkt, dass es wieder an seine ursprüngliche Position wechselt.

Diese Hypothese könnte völlig falsch sein, und mir ist klar, dass es mir schwer fällt, die Situation zu beschreiben, aber ich werde versuchen, so viel Klärung wie möglich zu geben.

Ich habe einen Testfall erstellt, Sie können hier den Quellcode herunterladen . Der Code dafür lautet:

%Vor%

Die Ausgabe ist:

  

geladen:   1   0   2   3

     

Tatsächlich:   0   1   2   3

Die erwartete "tatsächliche" Ausgabe sollte jedoch lauten:

  

1 0 2 3

Es ist erwähnenswert, dass die Verwendung des Tupelcodes zu leicht wackeligen Ergebnissen führt, aber nichts, was der tatsächlichen Reihenfolge entspricht. Sie können sehen, was ich meine, indem Sie diese Zeile auskommentieren.

    
Charlie 23.07.2015, 19:07
quelle

6 Antworten

2

Dies endete tatsächlich viel einfacher als erwartet. Da der aktuell geladene Post in activeConnections gehalten wird, kann ich einfach den Wert allPosts im geladenen Index durch den aktuell geladenen Post ersetzen:

%Vor%

Ich kann mir keine Nachteile dieser Methode vorstellen, aber wenn jemand an etwas denkt, lass es mich wissen.

    
Charlie 06.08.2015, 21:14
quelle
14

Sie können einfach über Tupel zuweisen:

%Vor%

Aber welches Problem hast du eigentlich mit swap ? Folgendes sollte gut funktionieren:

%Vor%     
Rob Napier 23.07.2015 19:15
quelle
3

Wenn Sie den Wert des changeIndex in String ändern können, sollte der folgende Code funktionieren

%Vor%     
neo 23.07.2015 20:36
quelle
2

Sie können einfach sort für den calledIndex-Wert verwenden:

%Vor%     
Gwendle 05.08.2015 11:15
quelle
2

Das Problem ist, dass das Tauschen der Werte nicht die richtige Reihenfolge ergibt, da Sie einen bereits getauschten Wert austauschen können. Wenn Sie zum Beispiel in der Reihenfolge 3,0,1,2 erhalten, dann tauschen Sie:

%Vor%

Das wird Ihnen also 1,2,0,3 geben, obwohl Sie 3,0,1,2 erhalten (und richtig getauscht) haben.

Wenn Sie möchten, dass das Swapping funktioniert, müssen Sie verfolgen, was getauscht wurde, damit Sie wissen, in welchen Index Sie wechseln möchten. Es ist wahrscheinlich einfacher, ein neues Array hinzuzufügen, wenn Sie die Daten zurückbekommen, oder ein neues Feld hinzuzufügen, um den geladenen Index zu speichern und am Ende zu sortieren.

    
MattM 06.08.2015 20:53
quelle
0

In Swift 4

%Vor%

Protokoll

%Vor%

Siehe SE-0173. Fügen Sie MutableCollection.swapAt hinzu (: :) für weitere Informationen über swapAt.

    
Saranjith 09.11.2017 07:24
quelle

Tags und Links