2016-03-27 6 views
1

In Swift 2.2, wird C-Stil für Anweisung veraltet, so dass ich modifizieren for-Schleife folgt:In Swift 2.2, wie die For-Schleife-Anweisung zu konsolidieren?

for var idx=data.count-1; idx>=0; --idx 

in

for idx in (0...data.count-1).reverse() // <--- new statement 

jedoch gefunden, wenn data.count 0 während der Ausführung ist, die neue Anweisung wird mit Fehler fatal error: Can't form range with end < start abstürzen.

Gibt es eine beste/Standard-Methode für diesen Fall?

P.S. Ich denke, ich muss verschiedene Arten von Schleifen/Syntax verwenden, um meine einheitlichen C-Style-Loops zu ersetzen. Jeder weitere Kommentar oder Vorschlag dazu ist willkommen.

+0

Ihre für (;;) und für in-Schleifen sind nicht gleich: erste Schleifen von data.count-1 zu 1 und einem zweiten Schlaufen aus data.count-1 zu 0. – Valentin

+0

@Valentin danke, ich habe es geändert. Es sollte nicht anders sein. –

+0

Gern geschehen. Ich habe meine Antwort mit Schritt (durch: durch :) anstelle von Schritt (zu: durch :) aktualisiert, du könntest es akzeptieren, wenn es dir geholfen hat. – Valentin

Antwort

2

sollten Sie Strideable.stride(through:by:) verwenden Ihre for-Loop-Bereich zu erzeugen, wie folgt aus:

for idx in (data.count-1).stride(through: 0, by: -1) { 
    print(idx) 
} 

Es selbst wenn data.count == 0 funktioniert.

3

eine Reihe als

0 ... data.count-1 

endet mit einer Laufzeitausnahme erstellen, wenn data.count Null ist. Es ist oft besser, den ..< Operator zu verwenden, um einen Bereich zu machen, die seinen oberen Wert auslässt, in Ihrem Fall:

0 ..< data.count 

Die für data.count == 0 funktioniert auch und erstellt einen leeren Bereich in diesem Fall. Dies gilt für sowohl vorwärts und rückwärts Iteration:

for idx in 0 ..< data.count { ... } 
for idx in (0 ..< data.count).reverse() { ... } 

(Natürlich stride() eine sinnvolle Alternative für den zweiten Fall ist.)

1

Stattdessen for idx in (0..<data.count).reverse() verwenden. Dies wird den leeren Bereich bilden, den Sie wünschen, wenn data.count == 0.

2

In solch einer einfachen Schleife, gibt es keine Notwendigkeit für arithmetische Operationen.

Wenn data ein Array ist, verwenden indices:

for index in data.indices { 
} 

for index in data.indices.reverse() { 
} 

oder die Daten direkt zugreifen

for item in data { 
} 

for item in data.reverse() { 
} 

oder einer Kombination des vorhergehenden enumerate

for (index, item) in data.enumerate() { 
} 

Beachten Sie, dass alle for-in Schleifen oben können werden auch als forEach geschrieben:

data.indices.forEach { 
}