发布于 2022-03-05

Swift - 控制流

swift

Swift 支持多种控制流语句,包括条件语句、循环语句和控制转移语句

学习目标

通过本教程,你将学会:

  • 掌握条件语句(if、switch)的使用
  • 理解各种循环语句(for、while、repeat-while)的区别和用法
  • 掌握控制转移语句(break、continue、fallthrough、return、throw)
  • 能够使用控制流语句解决实际问题

前置知识

Swift 支持多种控制流语句,包括条件语句、循环语句和控制转移语句。这些语句可以控制代码的执行流程,使程序能够根据不同的条件执行不同的代码路径。

条件语句

if 语句

let age = 20
if age < 18 {
  print("未成年人")
} else if age < 30 {
  print("年轻人")
} else {
  print("中年人")
}

switch 语句

Swift 的 switch 语句功能强大,支持多种匹配模式:

let score = 85
var grade: String

switch score {
case 90...100:
  grade = "优秀"
case 80..<90:
  grade = "良好"
case 70..<80:
  grade = "中等"
case 60..<70:
  grade = "及格"
case 0..<60:
  grade = "不及格"
default:
  grade = "无效分数"
}

print("成绩等级:\(grade)")

switch 语句还可以匹配多个值:

let character: Character = "a"
switch character {
case "a", "e", "i", "o", "u":
  print("这是一个元音字母")
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
  print("这是一个辅音字母")
default:
  print("这不是字母")
}

循环语句

for-in 循环

// 遍历数组
let fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits {
  print(fruit)
}

// 遍历区间
for i in 1...5 {
  print(i)  // 输出:1, 2, 3, 4, 5
}

// 遍历字典
let scores = ["张三": 90, "李四": 85, "王五": 95]
for (name, score) in scores {
  print("\(name): \(score)")
}

while 循环

var count = 0
while count < 5 {
  print(count)
  count += 1
}

repeat-while 循环

var number = 0
repeat {
  print(number)
  number += 1
} while number < 5

控制转移语句

break 语句

break 语句用于提前退出循环或 switch 语句:

for i in 1...10 {
  if i == 5 {
    break
  }
  print(i)  // 只输出:1, 2, 3, 4
}

continue 语句

continue 语句用于跳过当前循环的剩余代码,继续下一次循环:

for i in 1...10 {
  if i % 2 == 0 {
    continue
  }
  print(i)  // 只输出奇数:1, 3, 5, 7, 9
}

fallthrough 语句

fallthrough 语句用于在 switch 语句中继续执行下一个 case:

let score = 95
var message = ""

switch score {
case 90...100:
  message = "优秀"
  fallthrough  // 继续执行下一个 case
case 80..<90:
  message += ",继续保持"
default:
  print(message)
}

练习

练习 1:条件语句

编写代码实现以下功能:

  1. 根据年龄判断是否可以投票(18 岁以上可以投票)
  2. 根据分数判断等级(90-100 优秀,80-89 良好,70-79 中等,60-69 及格,60 以下不及格)
  3. 判断一个年份是否为闰年

参考答案

// 1. 投票判断
let age = 20
if age >= 18 {
  print("可以投票")
} else {
  print("不能投票")
}

// 2. 分数等级判断
let score = 85
switch score {
case 90...100:
  print("优秀")
case 80..<90:
  print("良好")
case 70..<80:
  print("中等")
case 60..<70:
  print("及格")
case 0..<60:
  print("不及格")
default:
  print("无效分数")
}

// 3. 闰年判断
let year = 2024
if (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) {
  print("\(year) 年是闰年")
} else {
  print("\(year) 年不是闰年")
}

练习 2:for 循环

完成以下任务:

  1. 计算 1 到 100 的和
  2. 打印 1 到 20 之间的所有偶数
  3. 遍历字符串数组,找出最长的字符串

参考答案

// 1. 计算 1 到 100 的和
var sum = 0
for i in 1...100 {
  sum += i
}
print("1 到 100 的和是 \(sum)")

// 2. 打印偶数
for i in 1...20 {
  if i % 2 == 0 {
    print(i)
  }
}

// 3. 找出最长的字符串
let words = ["Swift", "Python", "JavaScript", "Go"]
var longestWord = ""
var maxLength = 0

for word in words {
  if word.count > maxLength {
    maxLength = word.count
    longestWord = word
  }
}
print("最长的单词是:\(longestWord),长度为 \(maxLength)")

练习 3:while 循环

使用 while 循环完成以下任务:

  1. 计算一个数的阶乘
  2. 模拟猜数字游戏(随机生成一个 1-100 的数,直到猜对为止)
  3. 计算斐波那契数列的前 10 个数

参考答案

// 1. 计算阶乘
let n = 5
var factorial = 1
var i = 1

while i <= n {
  factorial *= i
  i += 1
}
print("\(n)! = \(factorial)")

// 2. 猜数字(简化版,使用固定数字)
let targetNumber = 42
var guess = 0
var attempts = 0

while guess != targetNumber {
  guess = Int.random(in: 1...100)
  attempts += 1
}
print("猜对了!数字是 \(targetNumber),用了 \(attempts) 次")

// 3. 斐波那契数列
var a = 0
var b = 1
var count = 0

print("斐波那契数列前10个数:")
while count < 10 {
  print(a, terminator: " ")
  let next = a + b
  a = b
  b = next
  count += 1
}

练习 4:控制转移语句

编写代码使用 break 和 continue:

  1. 找出 1 到 100 中第一个能被 7 和 13 同时整除的数
  2. 打印 1 到 50 之间的质数(使用 continue 跳过非质数)
  3. 使用 switch 和 fallthrough 实现多重条件判断

参考答案

// 1. 找出第一个能被 7 和 13 同时整除的数
for i in 1...100 {
  if i % 7 == 0 && i % 13 == 0 {
    print("第一个能被 7 和 13 同时整除的数是:\(i)")
    break
  }
}

// 2. 打印质数(简化版)
for number in 2...50 {
  var isPrime = true

  for i in 2..<number {
    if number % i == 0 {
      isPrime = false
      break
    }
  }

  if isPrime {
    print(number, terminator: " ")
  }
}

// 3. switch 和 fallthrough
let value = 85
switch value {
case 90...100:
  print("优秀")
  fallthrough
case 80..<100:
  print("良好以上")
case 70..<80:
  print("中等")
default:
  print("其他")
}

练习 5:综合练习

编写一个简单的成绩管理系统:

  1. 创建一个学生成绩数组
  2. 计算平均分
  3. 找出最高分和最低分
  4. 统计各个等级的人数

参考答案

let scores = [85, 92, 78, 96, 88, 75, 90, 82]

// 计算平均分
var sum = 0
for score in scores {
  sum += score
}
let average = Double(sum) / Double(scores.count)
print("平均分:\(average)")

// 找出最高分和最低分
var maxScore = scores[0]
var minScore = scores[0]

for score in scores {
  if score > maxScore {
    maxScore = score
  }
  if score < minScore {
    minScore = score
  }
}
print("最高分:\(maxScore),最低分:\(minScore)")

// 统计各等级人数
var excellent = 0
var good = 0
var medium = 0
var pass = 0
var fail = 0

for score in scores {
  switch score {
  case 90...100:
    excellent += 1
  case 80..<90:
    good += 1
  case 70..<80:
    medium += 1
  case 60..<70:
    pass += 1
  default:
    fail += 1
  }
}

print("优秀:\(excellent)人,良好:\(good)人,中等:\(medium)人,及格:\(pass)人,不及格:\(fail)人")

总结

本章介绍了 Swift 中的控制流语句:

  • 条件语句:if-else、switch,用于根据条件执行不同代码
  • 循环语句:for-in、while、repeat-while,用于重复执行代码
  • 控制转移:break、continue、fallthrough,用于改变代码执行流程

控制流是编程的基础,下一章我们将学习 函数,了解如何组织和重用代码。