Since you cannot change a number in "let", all the numbers should use "var"
For vs While
For: Finite (you give a range from the beginning)
While: Unpredictable (Until meets the target)
For Loop
example 1
let platforms = ["iOS", "macOS", "tvOS", "watchOS"]
// array
// os: loop variable
for os in platforms {
print("Swift works great on \(os).")
}
// loop iteration
/*
print:
Swift works great on iOS.
Swift works great on macOS.
Swift works great on tvOS.
Swift works great on watchOS.
*/
Loop over a fixed range of numbers
for i in 1...12 {
print("5 x \(i) is \(5 * i)")
}
/*
print:
5 x 1 is 5
5 x 2 is 10
5 x 3 is 15
5 x 4 is 20
5 x 5 is 25
5 x 6 is 30
5 x 7 is 35
5 x 8 is 40
5 x 9 is 45
5 x 10 is 50
5 x 11 is 55
5 x 12 is 60
*/
Nested Loops
In the below example, you may see that we used "up to" operator "..<" in order to limit the loop dynamically.
for i in 1..<4 {
print("The \(i) times table:")
for j in 1...2 {
print(" \(j) x \(i) is \(j * i)")
}
print()
}
/*
print:
The 1 times table:
1 x 1 is 1
2 x 1 is 2
The 2 times table:
1 x 2 is 2
2 x 2 is 4
The 3 times table:
1 x 3 is 3
2 x 3 is 6
*/
Loop without variable
In some cases you may not need a variable. So you can define it as "_"
var lyric = "Haters gonna"
for _ in 1...5 { // her is variable is "_'
lyric += " hate"
}
print(lyric)
Examples
var numbers = [1, 2, 3, 4, 5, 6]
for number in numbers {
if number % 2 == 0 {
print(number)
}
}
/*
print:
2
4
6
*/
for i in 1...8 {
if i < 3 {
print("\(i) is a small number")
}
}
/*
print:
1 is a small number
2 is a small number
*/
While Loop
Skipping Loop items
let filenames = ["me.jpg", "work.txt", "sophie.jpg", "logo.psd"]
for filename in filenames {
if filename.hasSuffix(".jpg") == true {
continue
}
print("Found picture: \(filename)")
}
/*
print:
Found picture: work.txt
Found picture: logo.psd
*/
// --------------
let filenames = ["me.jpg", "work.txt", "sophie.jpg", "logo.psd"]
for filename in filenames {
if filename.hasSuffix(".jpg") == false {
continue
}
print("Found picture: \(filename)")
}
/*
print:
Found picture: me.jpg
Found picture: sophie.jpg
*/
Breaking in a point
let number1 = 10
let number2 = 14
var multiples = [Int]()
for i in 1...100_000 {
if i.isMultiple(of: number1) && i.isMultiple(of: number2) {
multiples.append(i)
if multiples.count == 10 {
break
}
}
}
print(multiples)
// print: [70, 140, 210, 280, 350, 420, 490, 560, 630, 700]
Be aware of where you put the "Break". If you put it in the wrong place it will stop earlier.
var password = "1"
while true {
password += "1"
if password == "11111" {
print("That's a terrible password.")
break // exact point
}
}
// print: That's a terrible password.
// --
var password = "1"
while true {
password += "1"
if password == "11111" {
print("That's a terrible password.")
}
break // wrong place
}
// print: ""
Continue vs Break
Continue: As long as the result meets the criteria Continue
Break: Stop at a certain point
When we use continue we’re saying “I’m done with the current run of this loop” – Swift will skip the rest of the loop body, and go to the next item in the loop. But when we say break we’re saying “I’m done with this loop altogether, so get out completely.” That means Swift will skip the remainder of the body loop, but also skip any other loop items that were still to come. (HWS)
FizzBuzz
for i in 1...100 {
if i % 3 != 0 { if i % 5 != 0 { print(i)} }
if i % 3 == 0 { print("\(i) = Fizz") }
if i % 5 == 0 { print("\(i) = Buzz") }
if i % 3 == 0 { if i % 5 == 0 { print("\(i) = FizzBuzz") } }
}
/*
print:
1
2
3 = Fizz
4
5 = Buzz
6 = Fizz
7
8
9 = Fizz
10 = Buzz
11
12 = Fizz
13
14
15 = Fizz
15 = Buzz
15 = FizzBuzz
...
*//