Wenn ich die for-Schleife in Playground verwende, hat alles gut funktioniert, bis ich den ersten Parameter der for-Schleife auf den höchsten Wert geändert habe. (in absteigender Reihenfolge iteriert)
Ist das ein Fehler? Hatte es sonst noch jemand?
for index in 510..509
{
var a = 10
}
Der Zähler, der die Anzahl der Iterationen anzeigt, die ausgeführt werden sollen, tickt weiter ...
ios
swift
swift-playground
Krishnan
quelle
quelle
Antworten:
Xcode 6 Beta 4 hat zwei Funktionen hinzugefügt, um Bereiche mit einem anderen Schritt als einem zu iterieren: Dies
stride(from: to: by:)
wird mit exklusiven Bereichen undstride(from: through: by:)
mit inklusiven Bereichen verwendet.Um einen Bereich in umgekehrter Reihenfolge zu durchlaufen, können sie wie folgt verwendet werden:
Beachten Sie, dass keine dieser
Range
Funktionen eine Mitgliedsfunktion ist. Dies sind globale Funktionen, die entweder eineStrideTo
oder eineStrideThrough
Struktur zurückgeben, die sich von derRange
Struktur unterscheiden.In einer früheren Version dieser Antwort wurde die
by()
Member-Funktion derRange
Struktur verwendet, die in Beta 4 entfernt wurde. Wenn Sie sehen möchten, wie dies funktioniert, überprüfen Sie den Bearbeitungsverlauf.quelle
5.stride(to: 1, by: -1)
oder5.stride(through: 1, by: -1)
:
Operator ausgelöst werden, der implizit nach unten iteriert, was dazu führt, dass ihre Schleifen ausgeführt werden, wenn sie dachten, dass sie überspringen würden. Es ist sehr praktisch für die interaktive Verwendung, aber in Skripten furchtbar fehleranfällig, bis zu dem Punkt, an dem Styleguides davon abraten, es zu verwenden .Wenden Sie die Umkehrfunktion auf den Bereich an, um rückwärts zu iterieren:
Für Swift 1.2 und früher:
Es funktioniert auch mit halboffenen Bereichen:
Hinweis:
reverse(1...10)
Erstellt ein Array vom Typ[Int]
. Dies ist zwar für kleine Bereiche in Ordnung, es ist jedoch ratsam, eslazy
wie unten gezeigt zu verwenden oder die akzeptiertestride
Antwort zu berücksichtigen , wenn Ihr Bereich groß ist.Verwenden Sie
lazy
zusammen mit, um das Erstellen eines großen Arrays zu vermeidenreverse()
. Der folgende Test läuft effizient auf einem Spielplatz und zeigt, dass kein Array mit einer BillionInt
s erstellt wird!Prüfung:
Für Swift 2.0 in Xcode 7:
Beachten Sie, dass Swift 2.0
(1...1_000_000_000_000).reverse()
vom Typ istReverseRandomAccessCollection<(Range<Int>)>
, sodass dies einwandfrei funktioniert:For Swift 3.0
reverse()
wurde umbenannt inreversed()
:quelle
reversed
kann die Sammlung jedoch kopieren. Zumindest verstehe ich so die Dokumentation dazuData
.Aktualisiert für Swift 3
Die Antwort unten ist eine Zusammenfassung der verfügbaren Optionen. Wählen Sie diejenige, die Ihren Anforderungen am besten entspricht.
reversed
: Zahlen in einem BereichNach vorne
Rückwärts
reversed
: Elemente inSequenceType
Nach vorne
Rückwärts
reversed
: Elemente mit einem IndexManchmal wird ein Index benötigt, wenn eine Sammlung durchlaufen wird. Dafür können Sie verwenden
enumerate()
, was ein Tupel zurückgibt. Das erste Element des Tupels ist der Index und das zweite Element ist das Objekt.Nach vorne
Rückwärts
Beachten Sie, dass Sie, wie Ben Lachman in seiner Antwort feststellte , dies wahrscheinlich
.enumerated().reversed()
eher tun möchten als.reversed().enumerated()
(was die Indexzahlen erhöhen würde).Schritt: Zahlen
Schritt ist eine Möglichkeit, ohne Verwendung eines Bereichs zu iterieren. Es gibt zwei Formen. Die Kommentare am Ende des Codes zeigen, wie die Bereichsversion aussehen würde (vorausgesetzt, die Inkrementgröße ist 1).
Nach vorne
Rückwärts
Durch Ändern der Inkrementgröße auf
-1
können Sie rückwärts gehen.Beachten Sie den
to
undthrough
Unterschied.Schritt: Elemente von SequenceType
In Schritten von 2 vorwärts
Ich verwende
2
in diesem Beispiel nur, um eine andere Möglichkeit zu zeigen.Rückwärts
Anmerkungen
@matt hat eine interessante Lösung, bei der er seinen eigenen Reverse-Operator definiert und aufruft
>>>
. Das Definieren erfordert nicht viel Code und wird folgendermaßen verwendet:Schauen Sie sich C-Style For Loops an, die aus Swift 3 entfernt wurden
quelle
Swift 4 ab
quelle
Mit Swift 5 können Sie je nach Bedarf eines der vier folgenden Playground-Codebeispiele auswählen , um Ihr Problem zu lösen.
# 1. Mit
ClosedRange
reversed()
MethodeClosedRange
hat eine Methode namensreversed()
.reversed()
Methode hat die folgende Deklaration:Verwendung:
Alternativ können Sie folgende
Range
reversed()
Methode verwenden:# 2. Mit
sequence(first:next:)
FunktionDie Swift Standard Library bietet eine Funktion namens
sequence(first:next:)
.sequence(first:next:)
hat die folgende Erklärung:Verwendung:
#3. Mit
stride(from:through:by:)
FunktionDie Swift Standard Library bietet eine Funktion namens
stride(from:through:by:)
.stride(from:through:by:)
hat die folgende Erklärung:Verwendung:
Alternativ können Sie Folgendes verwenden
stride(from:to:by:)
:# 4. Mit
AnyIterator
init(_:)
initializerAnyIterator
hat einen Initialisierer aufgerufeninit(_:)
.init(_:)
hat die folgende Erklärung:Verwendung:
Bei Bedarf können Sie den vorherigen Code umgestalten, indem Sie eine Erweiterungsmethode für
Int
Ihren Iterator erstellen und diesen einschließen:quelle
Für Swift 2.0 und höher sollten Sie eine Bereichssammlung umgekehrt anwenden
Es wurde in Swift 3.0 in .reversed () umbenannt
quelle
In Swift 4 und letzterem
quelle
Swift 4.0
Wenn Sie den
to
Wert einschließen möchten :quelle
Wenn man ein Array (
Array
oder allgemeiner einesSequenceType
) in umgekehrter Reihenfolge durchlaufen möchte . Sie haben einige zusätzliche Optionen.Zuerst können Sie
reverse()
das Array wie gewohnt durchlaufen und es durchlaufen. Ich bevorzuge es jedoch,enumerate()
viel Zeit zu verwenden, da es ein Tupel ausgibt, das das Objekt und seinen Index enthält.Hier ist zu beachten, dass es wichtig ist, diese in der richtigen Reihenfolge aufzurufen:
for (index, element) in array.enumerate().reverse()
liefert Indizes in absteigender Reihenfolge (was ich allgemein erwarte). wohingegen:
for (index, element) in array.reverse().enumerate()
(das ist eine engere Übereinstimmung mit NSArrayreverseEnumerator
)Geht das Array rückwärts, gibt jedoch aufsteigende Indizes aus.
quelle
wie für Swift 2.2, Xcode 7.3 (10. Juni 2016):
Ausgabe :
quelle
Sie können stattdessen die C-Style-
while
Schleife verwenden. Dies funktioniert in Swift 3 einwandfrei:quelle
Sie können die reverse () -Methode verwenden, um Werte einfach umzukehren.
Die Methode reverse () kehrt die Werte um.
quelle
quelle