控制流(Control Flow)

swift里面的控制流分为For-In 循环While 循环条件语句控制转移语句提前退出检测 API 可用性


For-in循环

相对于OC,swift对for-in做出了加强,不仅仅能对数组遍历,还能对字典遍历,范围可以使用闭区间,item值可以用(_)进行忽略,还加入了stride(from:to:by:)stride(from:through:by:) 等新API

  • 遍历数组
let names = ["zhangsan", "lisi", "wangwu"]
  for name in names {   
    print(name)
  }
// zhangsan 
// lisi
// wangwu
  • 遍历字典
    通过遍历字典来访问它的键值对。遍历时,字典的每项元素会已(key, value)元祖的形式返回
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}
// ants have 6 legs
// spiders have 8 legs
// cats have 4 legs
  • 区间遍历
for index in 1...5 {
     print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
  • 忽略变量遍历
    当不需要区间序列内的每一项值,可以用下划线(_)替代变量名来忽略这个值,如下:
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
    answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// 输出 "3 to the power of 10 is 59049"
  • 跨越遍历
    当止需要取被遍历集合中的部分数据是可以使用跨越遍历(自己取的名字- -),方法名为:stride(from:to:by:)stride(from:through:by:) 如下:
let minutes = 60
let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // 每5分钟渲染一个刻度线(0, 5, 10, 15 ... 45, 50, 55)
}
let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // 每3小时渲染一个刻度线(3, 6, 9, 12)
}

可以这么理解: to不包含最后一个值,through包含最后一个值

While循环

while循环类似OC的用法,一直运行到条件变成false。而swift提供两种循环形式:whilerepeat-while(每次在循环结束后检查条件是否符合,类似OC的do-while

  • while
    每次循环开始前检查条件是否符合(先判断再循环)如下:
var condition = 0
while condition < 3 {
    condition += 1
    print(condition)

}
// 1
// 2
// 3
  • repeat-while
    每次在循环结束后检查条件是否符合(先循环然后再判断,类似OC的do-while)如下:
var condition = 3
repeat {
    condition += 1
    print(condition)
} while condition < 3
// 4

条件语句

swift提供两种条件语句ifswitch

  • if条件语句
    先判断if后面的语句是否为true,然后执行相关代码。if 语句允许二选一执行,叫做 else 从句。也就是当条件为 false 时,执行 else语句如下:
temperatureInFahrenheit = 40
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
} else {
    print("It's not that cold. Wear a t-shirt.")
}
// 输出 "It's not that cold. Wear a t-shirt."
  • switch条件语句
    switch语句会尝试把某个值与若干个模式进行匹配。根据第一个匹配成功的模式,switch语句会执行对应的代码。当有可能的情况较多时,通常switch语句替换if语句。每一个case都是代码执行的一条分支。switch语句会决定哪一条分支应该被执行。这个流程被称作根据给定的值切换(switching),switch语句必须完备,每一个可能的值都必须至少有一个case分支与之对应。当某些不能涵盖所有值得情况下,可以使用默认default分支来涵盖其它所有没有对应的值如下:
let someCharacter: Character = "z"
switch someCharacter {
case "a":
    print("The first letter of the alphabet")
case "z":
    print("The last letter of the alphabet")
default:
    print("Some other character")
}
// 输出 "The last letter of the alphabet"
  • 不存在隐式的贯穿
    与C和OC中的 switch 语句不同,在swift中,当匹配的case分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个case分支。也就是说,不需要在case分支中使用break。所以分支下必须要有执行语句,不然会编译错误如下:
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a": // 无效,这个分支下面没有语句
case "A":
    print("The letter A")
default:
    print("Not the letter A")
}
// 这段代码会报编译错误

为了让单个 case 同时匹配 aA,可以将这个两个值组合成一个复合匹配,并且用逗号分开如下:

let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}
// 输出 "The letter A
  • switch区间分配
    case分支的模式也可以是一个值的区间,使用区间匹配来输出任意数字对应的自然语言格式如下:
let approximateCount = 62
let countedThings = "moons orbiting Saturn"
let naturalCount: String
switch approximateCount {
case 0:
    naturalCount = "no"
case 1..<5:
    naturalCount = "a few"
case 5..<12:
    naturalCount = "several"
case 12..<100:
    naturalCount = "dozens of"
case 100..<1000:
    naturalCount = "hundreds of"
default:
    naturalCount = "many"
}
print("There are \(naturalCount) \(countedThings).")
// 输出 "There are dozens of moons orbiting Saturn."
  • switch-元祖
    我们还可以使用元祖在同一个switch语句中测试多个值,元祖中的元素可以是值,也可以是区间。可以使用下划线(_)来匹配所有可能的值。

你可能感兴趣的:(控制流(Control Flow))