100 Days of Swift - 04 Day: loops, loops, and more loops
4.1 For loops(For 循环)
- Swift loops 有很多种方式,内在机制是一样的,重复执行代码直到一个条件为false。
- 最常见的循环就是For 循环,For循环为有限循环, 遍历Array/Range,每次循环时都会拉出一个元素并分配给一个常量。
- 当不使用遍历时分配的常量时,建议用下划线替代常量名称,即:告知编译器不需要创建临时常量。
4.1.1 示例
let count = 1...10
for number in count {
print("Number is \(number)")
}
for _ in 1...5 {
print("play")
}
let albums = ["Red", "1989", "Reputation"]
for album in albums {
print("\(album) is on Apple Music")
}
4.2 while 循环
- Swift 循环之while 循环, while 循环为无限循环,使用while关键字,执行循环,当任意条件为false时终止循环
var number = 1
while number <= 20 {
print(number)
number += 1
}
print("Ready or not, here I come!")
4.3 repeat 循环
- repeat和while 类似,根据条件执行循环体
- repeat的循环条件在循环体末尾,先执行后判断条件。
var number = 1
repeat {
print(number)
number += 1
} while number <= 20
print("Ready or not, here I come!")
- repeat 弥补了while 循环的不足,先执行后判断,直到条件终止。
- 下面的示例先将数组随机洗牌,然后判断洗牌前后是否相等,否则再重新洗牌,直到不相等为止。似乎没有什么问题,只是有一行代码重复,但repeat 更符合语义。更简洁,无重复代码。
- while 洗牌
let numbers = [1, 2, 3, 4, 5]
var random = numbers.shuffled()
while random == numbers {
random = numbers.shuffled()
}
let numbers = [1, 2, 3, 4, 5]
var random: [Int]
repeat {
random = numbers.shuffled()
} while random == numbers
4.4 退出循环
var countDown = 10
while countDown >= 0 {
print(countDown)
if countDown == 4 {
print("I'm bored. Let's go now!")
break
}
countDown -= 1
}
let scores = [1, 8, 4, 3, 0, 5, 2]
var count = 0
for score in scores {
if score == 0 {
break
}
count += 1
}
4.5 退出多层循环
- 退出多层循环的意义在于优化性能
- Step 1 给外层循环加标签
- Step 2 在内层循环 需要退出的位置执行 break + 外层循环标签
outerLoop: for i in 1...10 {
for j in 1...10 {
let product = i * j
print ("\(i) * \(j) is \(product)")
if product == 50 {
print("It's a bullseye!")
break outerLoop
}
}
}
4.6 跳过循环
- continue 关键字跳过当前行,不跳出循环体,继续执行下一次循环
for i in 1...10 {
if i % 2 == 1 {
continue
}
print(i)
}
4.7 小结
- 循环允许执行重复代码直到条件终止
- 最常见的循环是for 循环,将循环中的每个数据项分配给一个临时常量
- 如果for循环体不需要临时常量则用下划线替代常量名,优化性能
- while 循环和 for 循环类似,先判断条件,后执行循环体,条件终止则循环终止
- repeat while 循环先执行后判断条件,始终会执行一次,比while 循环更强大
- break 退出单循环,不再执行循环体
- break + 外层循环标签 可退出 多次循环,优化性能
- continue 跳过当前循环,继续执行下一次循环