In dit artikel leer je over for-in-loop, de gebruiksscenario's en varianten ervan.
For-in-lussen worden gebruikt om een set taken een bepaald aantal keren uit te voeren. Deze lussen herhalen alle reeksen, zoals items in een array, bereik of tekens in een tekenreeks.
We gebruiken ook de for-in-lus om een aantal repetitieve processen een bepaalde tijd uit te voeren.
Waarom hebben we een for-in-lus nodig?
Stel je voor dat iemand je zegt een programma te schrijven dat Hallo, Wereld! in het scherm. Uw oplossing is:
print ("Hallo, wereld!")
Wat als, ze van gedachten veranderden en je vertelden een programma te schrijven dat Hallo, wereld! vijf keer in het scherm … Zonder de kennis van loop, zou uw oplossing kunnen zijn:
print ("Hello, World!") print ("Hello, World!") print ("Hello, World!") print ("Hello, World!") print ("Hello, World!")
Hmm. Het lijkt tijdrovend om vijf keer vergelijkbare code te schrijven om hetzelfde werk te doen. Zo ja, wat zou u doen als iemand u vraagt om een programma te schrijven dat Hello, World! honderd of zelfs miljoen keer in het scherm?
Een naïeve oplossing is om de print
verklaring een bepaald aantal keren te schrijven. Klinkt gek, toch? Maar er is een betere oplossing hiervoor met het gebruik van for-in
loops met weinig regels code, zoals:
for i in 1… 100 ( //outputs Hello world for 100 times in the screen print("Hello, World!") )
Maak je geen zorgen over de syntaxis, we gaan het hieronder onderzoeken.
For-in Loop-syntaxis
U kunt in Swift een for in-lus maken als:
voor in ( )
De bovenstaande lus herhaalt zich over een bereik en we hebben toegang tot elk element dat wordt geretourneerd uit het bereik in variabele. Als u niet weet wat het bereik is, kunt u het artikel raadplegen: Swift Ranges.
Hoe het werkt?
- De reeks die wordt herhaald is een.
- De is ingesteld op het eerste nummer in het bereik en de instructies in de lus worden uitgevoerd.
- Nadat de instructie is uitgevoerd, wordt de bijgewerkt om de tweede waarde in de te bevatten en wordt de instructie opnieuw uitgevoerd.
- Dit proces gaat door totdat het einde van het bereik is bereikt en de lus stopt.
Voorbeeld 1: hoe de for-in-lus werkt in Swift
for i in 1… 3 ( print("Hello world!. Value is (i)") )
Wanneer u het programma uitvoert, is de uitvoer:
Hallo Wereld!. Waarde is 1 Hallo wereld !. Waarde is 2 Hallo wereld !. Waarde is 3
In het bovenstaande programma is de reeks die wordt herhaald, een bereik van 1 tot 3.
De waarde van i wordt ingesteld op het eerste getal in het bereik (1), en bij elke iteratie bijgewerkt naar het volgende nummer van het bereik. Dit proces gaat door totdat het einde van het bereik (3) is bereikt.
Uitvoeringsstappen voor For-in-lusIteratie | Waarde geretourneerd uit bereik (i) | Uitvoer |
---|---|---|
1 | 1 | Hallo Wereld!. Waarde is 1 |
2 | 2 | Hallo Wereld!. Waarde is 2 |
3 | 3 | Hallo Wereld!. Waarde is 3 |
De bereikwaarde in een for-in-lus negeren
Als u de bereikwaarde binnen de lus niet kunt gebruiken, kunt u het gebruik van _
(onderstrepingsteken) in Swift verwijderen als:
voor in ( )
Voorbeeld 2: bereikwaarde in for-in-lus negeren
// This example neglects value and uses half open range operator for _ in 1… <3 ( print("Hello world!") )
Wanneer u het programma uitvoert, is de uitvoer:
Hallo Wereld! Hallo Wereld!
In het bovenstaande programma is de reeks die wordt herhaald een bereik van 1 tot 2 vanwege het gebruik van een halfopen bereikoperator (… <) die de ondergrens (1) maar niet de bovengrens (3) omvat.
_
negeert de waarde uit het bereik (1) en de printinstructie wordt uitgevoerd. De printinstructie wordt opnieuw aangeroepen voor de volgende iteratie en het proces eindigt omdat 2 de laatste waarde in het bereik is.
Iteratie | Waarde geretourneerd uit bereik | Uitvoer |
---|---|---|
1 | Weggegooid | Hallo Wereld! |
2 | Weggegooid | Hallo Wereld! |
for-in lus voor vaste intervallen met stride
Als je een lus wilt die in elke iteratie met een vaste waarde wordt verhoogd, in plaats van bereik, moet je de stride-methode gebruiken.
Voorbeeld 3: for-in-lus met stride-methode
let interval = 2 for i in stride(from: 1, to: 10, by: interval) ( print(i) )
Wanneer u het programma uitvoert, is de uitvoer:
1 3 5 7 9
In het bovenstaande programma stride
retourneert de functie de reeks getallen: 1, 3, 5, 7, 9.
De waarde van i wordt ingesteld op het eerste nummer van de reeks (1), en de printinstructie binnen de lus wordt uitgevoerd die "1" in de console uitvoert.
Nadat de instructie is uitgevoerd, wordt de waarde van i bijgewerkt naar een andere waarde (3) en wordt de printinstructie opnieuw aangeroepen. Dit proces gaat door totdat alle elementen van de reeks toegankelijk zijn.
For-in loop-uitvoeringsstappen met strideWaarde | Conditie (waarde <einde) | i (uitvoer) |
---|---|---|
1 | 1 <10 (waar) | 1 |
1 + 2 = 3 | 3 <10 (waar) | 3 |
1 + 2 * 2 = 5 | 5 <10 (waar) | 5 |
1 + 3 * 2 = 7 | 7 <10 (waar) | 7 |
1 + 4 * 2 = 9 | 9 <10 (waar) | 9 |
1 + 5 * 2 = 11 | 11 <10 (onwaar) | Stopt |
Hoe toegang krijgen tot elementen van een verzameling met de for-in-lus?
Stel dat u een reeks strings heeft zoals hieronder. Als u niets van array af weet, beschouw array dan als een enkele container die meer dan één waarde kan opslaan. Zie Swift Arrays voor meer gedetailleerde uitleg.
let programmingLanguages = ("Swift", "Java", "Go", "JavaScript", "Kotlin", "Python")
What if someone told you to print all the programming languages?
A way is to access those elements using index as programmingLanguages(0), programmingLanguages(1)
… and so on till you get all the elements. But this is too tedious.
Here comes for-in loop to the rescue. You can iterate using for in loop as:
Example 4: Accessing elements of an array (collection) using for-in loop
let programmingLanguages = ("Swift", "Java", "Go", "JavaScript", "Kotlin", "Python") for language in programmingLanguages ( print(language) )
When you run the program, the output will be:
Swift Java Go JavaScript Kotlin Python
In the above program, the sequence being iterated over is an array of strings.
The value of language is set to the first element of the array, and the print statement inside the loop is executed which outputs "Swift" in the console.
After the statement is executed, language is updated with the next element of the array and the print statement is called again. This process continues until the last element of array is accessed.
Example 5: Accessing elements of a string (collection) using for-in loop
Since, in Swift, strings are also collection, you can access each character in a string using for loop.
for value in "I♥Swift!" ( print(value) )
When you run the program, the output will be:
I ♥ S w i f t !
How to access indices of a collection using for-in loop?
If you want to access the index of the array (position of elements in an array i.e. 0, 1, 2), you need to use enumerated
method as:
Example 6: Accessing indices of an array using for-in loop
let programmingLanguages = ("Swift", "Java", "Go", "JavaScript", "Kotlin", "Python") for (index, language) in programmingLanguages.enumerated() ( print("(index):(language)") )
When you run the program, the output will be:
0:Swift 1:Java 2:Go 3:JavaScript 4:Kotlin 5:Python
Here, the enumerated method returns a tuple (Int
, String
) composed of the index (Int
) and the value (String
) for each item in the array. For example: (0, Swift), (1, Java)…
Using for-in
loop, you can access these items in a tuple one by one. If you don't know about Tuple, you can simply think it as a container that can hold value of different types. For more detailed explanation, see Swift Tuples .
How to filter elements using where clause in a for-in loop?
You can also filter contents from for in loop using where clause as
for value in "I♥Swift!" where value != "!" ( print(value) //removes exclamation sign )
When you run the program, the output will be:
I ♥ S w i f t
In the above program, the sequence being iterated over is string (collection of characters).
waarde wordt ingesteld op het eerste teken van de tekenreeks en wordt gecontroleerd met de where-voorwaarde. Als de conditie terugkeert true
, wordt het blok binnen de lus (print statement) uitgevoerd dat "I" in de console uitvoert.
Nadat de instructie is uitgevoerd, wordt de waarde bijgewerkt naar het volgende teken van de tekenreeks en wordt opnieuw de voorwaarde gecontroleerd. Als de voorwaarde terugkeert false
, wordt het blok niet uitgevoerd en wordt de waarde bijgewerkt naar het volgende teken.
Dit proces gaat door totdat het laatste teken van de tekenreeks is geopend.
Filter met de uitvoeringsstappen van de for-in-lusIteratie | waarde | value! = "!" | Uitvoer |
---|---|---|---|
1 | ik | waar | ik |
2 | ♥ | waar | ♥ |
3 | S | waar | S |
4 | w | waar | w |
5 | ik | waar | ik |
6 | f | waar | f |
7 | t | waar | t |
8 | ! | false |