免费开源的iOS开发学习平台

Swift: 6.2 语句和流程控制--分支条件语句

条件语句在程序语言设计中是必不可少的。Swift语言中提供了两种类型的条件语句:if语句和switch语句。当条件较为简单且可能的条件判断情况较少时,会使用if语句。switch语句则更适用在条件较为复杂、可能情况较多且需要用到模式匹配(pattern-matching)的情境。

#if语句
Swift中if语句的语法跟Objective-C是一样的,只不过在写法上,if语句的条件判断表达式可以省去左右括号。

let five = 5
if five < 5 {
    print("小于5")
}else if five > 5{
    print("大于5")
}else{
    print("等于5")
}
//打印结果:等于5

#switch语句

  • 在Swift语言中,switch语句最简单的形式就是把某个值与一个或若干个相同类型的值作比较。
let someCharacter: Character = "z"
switch someCharacter {
case "a":
    print("26个字母的首字母")
case "z":
    print("26个字母的尾字母")
default:
    print("其他字符")
}
//打印结果 "26个字母的尾字母"
  • 与C语言和Objective-C中的switch语句不同,在Swift中,不存在隐式的贯穿(No Implicit Fallthrough),即当匹配的 case 分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个case分支。这也就是说,不需要在case分支中显式地使用break语句。这使得switch语句更安全、更易用,也避免了因忘记写break语句而产生的错误。这就要求在case语句中,至少要包含一条可执行语句。
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a": // 这里会报错,因为这个case语句没有执行体
case "A":
    print("字符A")
default:
    print("不是字符A")
}
  • 当然switch语句也是可以同时匹配多个条件的,只要在case语句后面的多个条件用逗号进行分隔即可。
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "A", "a":
    print("字符A")
default:
    print("不是字符A")
}
//打印结果:字符A    
  • case分支的模式也可以是一个值的区间。例如,在下面的例子中,展示了使用区间匹配来输出任意数字对应的中文表达。
let approximateCount = 51
var chineseStr: String
switch approximateCount {
case 0:
    chineseStr = "零"
case 1..<10:
    chineseStr = "个"
case 10..<100:
    chineseStr = "十"
case 100..<1000:
    chineseStr = "百"
default:
    chineseStr = "未知"
}
print("\(approximateCount)最高位是\(chineseStr)位")
//打印结果:51最高位是十位
  • switch语句可以用元组(x,y,z,...)来匹配多个值。元组中的每个值可以与特定的值或者值的区间进行匹配。此外,还可以使用下划线(_)作为通配符表示与任何值都可以匹配。下面示例展示一个确定(x,y)坐标点在二维坐标系的哪条直线上面。
let pos = (-1,1)
switch pos {
case (_,0):
    print("(\(pos.0),\(pos.1))在X轴上")
case (0,_):
    print("(\(pos.0),\(pos.1))在Y轴上")
case (-2...2,-2...2):
    print("(\(pos.0),\(pos.1))在矩形(-2,2),(-2,2)区域之内")
default:
    print("(\(pos.0),\(pos.1))在矩形(-2,2),(-2,2)区域之外")
}
  • switch的case分支可以把它匹配到的值绑定到临时常量或者变量中以供执行体使用。我们把这种行为称之为值绑定(value binding),不过临时常量或变量的作用域是case的执行体。
let anotherPoint = (0, 1)
switch anotherPoint {
case (let x, 0):
    print("在X轴上,且x的值是\(x)")
case (0, let y):
    print("在Y轴上,且y的值是\(y)")
case let (x, y):
    print("在其他地方 (\(x), \(y))")
}
// 打印结果:在Y轴上,且y的值是1
  • switch的case分支可以使用where语句来判断额外的条件。如下是示例,可以用来判断二维坐标是否坐落在x=y 或者 x=-y直线上面。
let anotherPoint = (1, -1)
switch anotherPoint {
case (let x,let y) where x==y:
    print("(\(x),\(y))在直线x=y上")
case (let x, let y) where x == -y:
    print("(\(x),\(y))在直线x=-y上")
case let (x, y):
    print("在其他地方 (\(x), \(y))")
}
// 打印结果:(1,-1)在直线x=-y上

示例代码

https://github.com/99ios/23.6.2