swift5-流程控制

Posted by AndyCao on September 7, 2019

if

if 后面的条件可以省略小括号,条件只能是Bool类型

let age = 20
if age > 20 {
    print("20多岁了")
}
else if age < 10 {
    print("小孩子")
}
else {
    print("年轻人")
}

// 以下写法将不会编译通过(if 条件只能是Bool类型)
if age {

}

while

repeat-while 相当于C语言的 do while

// while 循环
var num = 5
while num > 0 {
    print("num is \(num)")
    num -= 1
}

// repeat while 循环
var num2 = -1
repeat {
    print("num is \(num2)")
} while num2 > 0

for

for 循环使用区间运算符

  • 闭区间运算符:比如 0…3 代表大于等于0小于等于3
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for i in 0...3 {
    print(names[i])
}

// 也可以将区间运算符定义为常量
let names = ["张三", "李四", "思聪", "尼古拉斯"]
let range = 0...3
for i in range {
    print(names[i])
}

// 也可以区间运算符使用某一个变量\常量
let index = 0
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for i in index...3 {
    print(names[i])
}

// i 默认是 let,也可以声明为 var 变量
for var i in 1...3 {
    i+=5
    print(i)
}

// 如果循环语句当中没有用到 i,可以写成 _ 表示忽略循环变量
for _ in 1...3 {
    print("循环了")
}
  • 半开区间运算符:比如a..<b 代表 大于等于a小于b
for i in 1..<3 {
    print("循环了")
}
  • 区间运算符应用在数组上:
    let names = ["张三", "李四", "思聪", "尼古拉斯"]
    for name in names[0...3] {
      print(name)
    }
    
  • 单侧区间:让区间向一个方向尽可能的远
// 下面这种写法代表从数组的第二个元素开始,一直遍历到数组的末尾
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for name in names[1...] {
    print(name)
}

// 下面这种写法代表从数组的第1个元素开始,一直遍历到数组的第三个元素
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for name in names[...2] {
    print(name)
}

// 半开区间,小于数组的第三个元素
let names = ["张三", "李四", "思聪", "尼古拉斯"]
for name in names[..<2] {
    print(name)
}

// 无穷区间(代表负无穷到小于等于5)
let range = ...5
range.contains(-1) // true
range.contains(6)  // false

区间类型

区间类型分为三种:

  • ClosedRange:闭合区间
let range1: ClosedRange<Int> = 1...3
  • Range:半开区间
    let range2: Range<Int> = 1..<3
    
  • PartialRangeThrough:单侧区间
    let range3: PartialRangeThrough<Int> = ...5
    

字符、字符串也能使用区间运算符, 但默认不能用在for-in

// 字符串使用区间运算符(这种写法表示取值范围为:cc,cd,ce,cf....fe,ff)
let stringRange1 = "cc...ff" // 类型为ClosedRange<String>
stringRange1.contains("cb") // false
stringRange1.contains("dz")  // true 

// 也可以这样写
let stringRange2 = "a...f"
stringRange2.contains("c")  // true
stringRange2.contains("z") // flase

// 声明区间类型为CloseRange<Character>, \0到~囊括了所有ASCII字符
let characterRange: ClosedRange<Character> = "\0"..."~"
characterRange.contains("G") // true

带间隔的区间值

let hours = 11
let hourInterval = 2
// tickMark的取值:从4开始,累加2,不超过11
for tickMark in stride(from: 4, through: hours, by: hourInterval) {
    print(tickMark) // 输出 4 6 8 10
}

switch

case、default后面不能写大括号{}, 也可以不用写break(并不会贯穿到后面的条件)如:

var number = 1
switch number {
case 1:
    print("number = 1")
    break; // 也可以不用写break,不会贯穿到后面的条件执行
case 2:
    print("number = 2")
    break; // 也可以不用写break,不会贯穿到后面的条件执行
default:
    print("number is other")
    break; // 也可以不用写break,不会贯穿到后面的条件执行
}
// 打印结果:number = 1

fallthrough 可以实现贯穿效果

var number = 1
switch number {
case 1:
    print("number = 1")
    fallthrough
case 2:
    print("number = 2")
default:
    print("number is other")
}
// 打印结果number = 1 number = 2

switch语句必须要保证能处理所有情况,没有保证能够处理所有情况就会编译失败:

处理方法:case、default后面至少要有一条语句;如果不想做任何事情,加一个break即可

var number = 1
switch number {
case 1:
    print("number = 1")
case 2:
    print("number = 2")
default:
    break
}

如果能够保证处理所有情况(比如枚举值),就不必使用default

enum Answer {case wrong, right}
let result = Answer.right
switch result {
case Answer.wrong:
    print("你的答案错误了")
case Answer.right:
    print("正确")
}

switch 也支持Character、String类型

let name = "jack"
switch name {
case "jack":
    print("jack")
case "robin":
    print("robin")
default:
    break
}

// 也可以这样写,等同于贯穿执行
let name = "jack"
switch name {
case "jack", "robin":
    print("jack,robin")
default:
    break
}

区间匹配

let count = 62
switch count {
case 0:
    print("0")
case 1..<5:
    print("a few")
case 10..<100:
    print("dozens of")
case 100..<1000:
    print("hundreds of")
default:
    break
}

元组匹配

let point = (1, 1)
switch point {
case (0, 0):
    print("origin")
case (_, 0): // 代表左边是什么值都行
    print("x-axis")
case (0, _): // 代表右边是什么值都行 
    print("y-axis")
case (-2...2, -2...2):
    print("inside the box")
default:
    print("outside")
    break
}