Comment répéter for loop dans le sens inverse swift?

Quand j'utilise for loop à Playground, Tout a fonctionné bien jusqu'à ce que je changeais le premier paramètre for loop À la plus haute valeur. /Répété en ordre décroissant/

Est-ce que ce bug? At-il eu quelqu'un d'autre?


for index in 510..509
{
var a = 10
}


Compteur, qui montre le nombre d'itérations qui seront terminées, continue de cocher ...
Invité:

Emilie

Confirmation de:

Xcode 6 beta 4 Ajouté deux fonctions pour l'itération dans des gammes avec une étape autre qu'un:
stride/from: to: by:/

, qui est utilisé avec des gammes exceptionnelles, et
stride/from: through: by:/

, qui est utilisé avec des gammes inclusives.

Pour l'itération dans la gamme dans l'ordre inverse, ils peuvent être utilisés comme suit:


for index in stride/from: 5, to: 1, by: -1/ {
print/index/
}
//prints 5, 4, 3, 2

for index in stride/from: 5, through: 1, by: -1/ {
print/index/
}
//prints 5, 4, 3, 2, 1


Notez qu'aucun d'entre eux n'est une fonction de membre
Range

. Ce sont des fonctions globales qui renvoient la structure
StrideTo

, Soit la structure
StrideThrough

, qui sont différents de la structure
Range

.

Dans la version précédente de cette réponse, une fonction de membre a été utilisée.
by//

Structures
Range

, qui a été supprimé dans la version bêta 4. Si vous voulez voir comment cela fonctionne, vérifiez l'historique de modification.

Babette

Confirmation de:

Appliquez la fonction inverse sur un cercle pour effectuer des itérations dans la direction opposée:

Pour

Swift 1.2

et versions antérieures:


// Print 10 through 1
for i in reverse/1...10/ {
println/i/
}


Cela fonctionne également avec des bandes semi-ouvertes:


// Print 9 through 1
for i in reverse/1..<10/ {
println/i/
}


Noter:
reverse/1...10/

Crée un tableau de type
[Int]

, Par conséquent, bien que cela puisse être bon pour les petites gammes, il serait raisonnable d'utiliser
lazy

, Comme indiqué ci-dessous, ou envisagez la réponse acceptée
stride

, Si votre gamme est grande.

Pour éviter de créer un grand tableau, utilisez
lazy

ensemble avec
reverse//

. Le test suivant fonctionne efficacement sur le terrain de jeu, montrant qu'il ne crée pas de matrice avec un billion de monnaie
Int

avec!

Test

:


var count = 0
for i in lazy/1...1_000_000_000_000/.reverse// {
if ++count > 5 {
break
}
println/i/
}


Pour

Swift 2.0

à Xcode 7:


for i in /1...10/.reverse// {
print/i/
}


S'il vous plaît noter que dans Swift 2.0
/1...1_000_000_000_000/.reverse//

Il a du type
ReverseRandomAccessCollection/>

, Donc ça marche bien:


var count = 0
for i in /1...1_000_000_000_000/.reverse// {
count += 1
if count > 5 {
break
}
print/i/
}


Pour

Swift 3.0

reverse//

a été renommé B.
reversed//

:


for i in /1...10/.reversed// {
print/i/ // prints 10 through 1
}

Constantine

Confirmation de:

Mis à jour pour Swift 3

La réponse ci-dessous est un bref résumé des options disponibles. Choisissez celui qui correspond le mieux à vos besoins.


reversed

: Nombres dans la gamme

Effronté


for index in 0..<5 {
print/index/
}

// 0
// 1
// 2
// 3
// 4


Retour


for index in /0..<5/.reversed// {
print/index/
}

// 4
// 3
// 2
// 1
// 0



reversed

: Éléments B.
SequenceType



let animals = ["horse", "cow", "camel", "sheep", "goat"]


Effronté


for animal in animals {
print/animal/
}

// horse
// cow
// camel
// sheep
// goat


Retour


for animal in animals.reversed// {
print/animal/
}

// goat
// sheep
// camel
// cow
// horse



reversed

: Éléments avec index

Parfois, l'index est requis lorsque des itérations sur la collection. Pour cela, vous pouvez utiliser
enumerate//

, Qui retourne un coeur. Le premier élément du tuple est l'index et le deuxième objet.


let animals = ["horse", "cow", "camel", "sheep", "goat"]


Effronté


for /index, animal/ in animals.enumerated// {
print/"\/index/, \/animal/"/
}

// 0, horse
// 1, cow
// 2, camel
// 3, sheep
// 4, goat


Retour


for /index, animal/ in animals.enumerated//.reversed// {
print/"\/index/, \/animal/"/
}

// 4, goat
// 3, sheep
// 2, camel
// 1, cow
// 0, horse


Remarque , Quoi, comme l'a noté Ben Lahman

, Vous voulez probablement faire
.enumerated//.reversed//

, mais non
.reversed//.enumerated//

/Ce qui entraînera une augmentation du nombre d'indices/.

Étape: chiffres

L'étape est la méthode d'itération sans utilisation de la plage. Il y a deux formes. Commentaires à la fin du code montrent quelle est la gamme de gamme /à condition que le taux d'incrément soit égal 1/.


startIndex.stride/to: endIndex, by: incrementSize/ // startIndex..<endindex "="" "\="" "camel",="" "cow",="" "goat"][="" "sheep",="" ,="" -1="" .="" 0="" 0,="" 0[="" 1="" 1,="" 2="" 2,="" 3="" 3,="" 4="" 4,="" 4[="" 5,="" @matt="" [code]="" [code]-1[="" [code]2[="" [code]for="" [code]let="" [code]through[="" [code]to[="" \="" a="" animals='["horse",' animals[index]="" arrière.="" attention="" autre="" avec="" by:="" camel="" cet="" changer="" code]="" cow="" dans="" de="" différence="" détermine="" effronté="" en="" endindex,="" entre="" entrées="" et="" exemple,="" faites="" from:="" goat="" goat[="" horse="" horse[="" il="" in="" incrementsize="" index="" inversé="" j'utilise="" l'appelle="" l'incrément="" la="" montrer="" opportunité.="" opérateur="" où="" permet="" pour="" print="" propre="" retour="" revenir="" sequencetype="" seulement="" sheep="" son="" startindex...endindex[="" startindex.stride="" stride="" sur="" taille="" through:="" to:="" transmettre="" une="" vous="" {="" }="" à="" éléments="" étape="" étape:="">&gt;&gt;

. Il ne nécessite pas beaucoup de code pour déterminer et est utilisé comme suit:


for index in 5&gt;&gt;&gt;0 {
print/index/
}

// 4
// 3
// 2
// 1
// 0


Vérifier
http://bjmiller.me/post/137624 ... ift-3
</endindex>

Gabriel

Confirmation de:

Swift 4

Et plus loin


for i in stride/from: 5, to: 0, by: -1/ {
print/i/
}
//prints 5, 4, 3, 2, 1

for i in stride/from: 5, through: 0, by: -1/ {
print/i/
}
//prints 5, 4, 3, 2, 1, 0

Camille

Confirmation de:

Par Swift 5, Conformément à vos besoins, vous pouvez choisir l'un des

Quatre des exemples suivants du code de terrain de jeu

, Pour résoudre votre problème.

#1. en utilisant une méthode
ClosedRange


reversed//



ClosedRange

a une méthode nommée
https://developer.apple.com/do ... ersed
.
reversed//

La méthode a l'annonce suivante:


func reversed// -> ReversedCollection<closedrange<bound>&gt;


Renvoie une vue représentant les éléments de la collection dans l'ordre inverse.

Utilisant

:


let reversedCollection = /0 ... 5/.reversed//

for index in reversedCollection {
print/index/
}

/*
Prints:
5
4
3
2
1
0
*/


Alternativement, vous pouvez utiliser la méthode
Range


reversed//

:


let reversedCollection = /0 ..&lt; 6/.reversed//

for index in reversedCollection {
print/index/
}

/*
Prints:
5
4
3
2
1
0
*/


#2. En utilisant une fonction
sequence/first:next:/


Bibliothèque standard Swift Fournit une fonctionnalité
https://developer.apple.com/do ... uence
.
sequence/first:next:/

a la déclaration suivante:


func sequence<t>/first: T, next: @escaping /T/ -&gt; T?/ -&gt; UnfoldFirstSequence<t>


Retourne une séquence formée de
first

et applications paresseuses répétées
next

.

Utilisant

:


let unfoldSequence = sequence/first: 5, next: {
$0 &gt; 0 ? $0 - 1 : nil
}/

for index in unfoldSequence {
print/index/
}

/*
Prints:
5
4
3
2
1
0
*/


#3. En utilisant une fonction
stride/from:through:by:/


Bibliothèque standard Swift Fournit une fonctionnalité
https://developer.apple.com/do ... tride
.
stride/from:through:by:/

Il a l'annonce suivante:


func stride<t>/from start: T, through end: T, by stride: T.Stride/ -&gt; StrideThrough<t> where T : Strideable


Renvoie une séquence de la valeur initiale à la valeur finale et, éventuellement, y compris, sur la valeur spécifiée.

Utilisant

:


let sequence = stride/from: 5, through: 0, by: -1/

for index in sequence {
print/index/
}

/*
Prints:
5
4
3
2
1
0
*/


Alternativement, vous pouvez utiliser
https://developer.apple.com/do ... tride
:


let sequence = stride/from: 5, to: -1, by: -1/

for index in sequence {
print/index/
}

/*
Prints:
5
4
3
2
1
0
*/


#4. Utilisation de l'initialisateur
AnyIterator


init/_:/



AnyIterator

a une initialisée appelée
https://developer.apple.com/do ... -init
.
init/_:/

Il a l'annonce suivante:


init/_ body: @escaping // -&gt; AnyIterator<element>.Element?/


Crée un itérateur qui enveloppe cette fermeture dans sa méthode
next//

.

Utilisant

:


var index = 5

guard index &gt;= 0 else { fatalError/"index must be positive or equal to zero"/ }

let iterator = AnyIterator/{ // -&gt; Int? in
defer { index = index - 1 }
return index &gt;= 0 ? index : nil
}/

for index in iterator {
print/index/
}

/*
Prints:
5
4
3
2
1
0
*/


Si nécessaire, vous pouvez reflétoriser le code précédent en créant la méthode d'expansion pour
Int

Et enveloppé son itérateur dedans:


extension Int {

func iterateDownTo/_ endIndex: Int/ -&gt; AnyIterator<int> {
var index = self
guard index &gt;= endIndex else { fatalError/"self must be greater than or equal to endIndex"/ }

let iterator = AnyIterator { // -&gt; Int? in
defer { index = index - 1 }
return index &gt;= endIndex ? index : nil
}
return iterator
}

}

let iterator = 5.iterateDownTo/0/

for index in iterator {
print/index/
}

/*
Prints:
5
4
3
2
1
0
*/


</int></element></t></t></t></t></closedrange<bound>

Gilles

Confirmation de:

Pour Swift 2.0 et au-dessus, vous devez appliquer l'inverse à la gamme de gammes


for i in /0 ..< 10/.reverse// {
// process
}


Il a été renommé de .reversed// à Swift 3.0

Felix

Confirmation de:

À Swift 4 et ensuite


let count = 50//For example
for i in /1...count/.reversed// {
print/i/
}

Gaspard

Confirmation de:

Swift 4.0


for i in stride/from: 5, to: 0, by: -1/ {
print/i/ // 5,4,3,2,1
}


Si vous voulez activer la valeur
to

:


for i in stride/from: 5, through: 0, by: -1/ {
print/i/ // 5,4,3,2,1,0
}

Conrad

Confirmation de:

concernant Swift 2.2, Xcode 7.3 /10 juin 2016

G./ :


for /index,number/ in /0...10/.enumerate// {
print/"index \/index/ , number \/number/"/
}

for /index,number/ in /0...10/.reverse//.enumerate// {
print/"index \/index/ , number \/number/"/
}


Sortir

:


index 0 , number 0
index 1 , number 1
index 2 , number 2
index 3 , number 3
index 4 , number 4
index 5 , number 5
index 6 , number 6
index 7 , number 7
index 8 , number 8
index 9 , number 9
index 10 , number 10


index 0 , number 10
index 1 , number 9
index 2 , number 8
index 3 , number 7
index 4 , number 6
index 5 , number 5
index 6 , number 4
index 7 , number 3
index 8 , number 2
index 9 , number 1
index 10 , number 0

Emile

Confirmation de:

Si quelqu'un veut passer

déployer

/
Array

ou, plus répandu, tout
SequenceType

/ dans le sens inverse. Vous avez quelques options supplémentaires.

Tout d'abord, vous pouvez
reverse//

Un tableau et faites-le parcourir, comme d'habitude. Cependant, je préfère utiliser
enumerate//

La plupart du temps, car il affiche un tuple contenant un objet et son index.

La seule chose à noter ici est qu'il est important de les appeler dans le bon ordre:


for /index, element/ in array.enumerate//.reverse//


Donne des index en ordre décroissant /Ce que je m'attends habituellement/. tandis que:


for /index, element/ in array.reverse//.enumerate//

/qui plus proche de K. NSArray
reverseEnumerator

/

Marche à travers la matrice de retour, mais apporte des indices vers le haut.

Dominique

Confirmation de:

Au lieu de cela, vous pouvez envisager d'utiliser un cycle C-Style
while

. Ça marche génial dans Swift 3:


var i = 5 
while i > 0 {
print/i/
i -= 1
}

Constantine

Confirmation de:

Vous pouvez utiliser la méthode reversed// Pour faciliter les valeurs d'inversion.


var i:Int
for i in 1..10.reversed// {
print/i/
}


Méthode reversed// Annule les valeurs.

Francois

Confirmation de:

var sum1 = 0
for i in 0...100{
sum1 += i
}
print /sum1/

for i in /10...100/.reverse//{
sum1 /= i
}
print/sum1/

Clement

Confirmation de:

Pour moi, c'est le meilleur moyen.


[code]var arrayOfNums = [1,4,5,68,9,10]

for i in 0..<arrayofnums.count -="" 1]="" <="" arrayofnums[arrayofnums.count="" code]="" div="" i="" print="" {="" }[="">
</arrayofnums.count>

Pour répondre aux questions, connectez-vous ou registre