循环控制

for-in 循环

当字典遍历时,每一个元素都返回一个 (key, value) 元组,你可以在 for-in 循环体中使用显示命名常量来分解 (key, value) 元组成员

let numberOfLegs = ["spider": 8, "ant": 6, "cat":4]

for (animal, leg) in numberOfLegs {
    print("\(animal) has \(leg) legs")
}

for t in numberOfLegs {
    print("\(t.0) has \(t.1) legs")
}

如果不需要序列的每一个值,可以使用下划线带取代遍历名以忽略值

let base = 3
let power = 5
var answer = 1

for _ in 1...power {
    answer *= base
}

print("\(base) to the power of \(power) is \(answer)")

使用 stride(from:to:by:) 函数来跳过不想要的标记(开区间)
闭区间同样适用,使用 stride(from:through:by:) 即可

let minuteInterval = 5

for trickMark in stride(from: 0, to: 50, by: minuteInterval) {
    print(trickMark)
}

for trickMark in stride(from: 0, through: 50, by: minuteInterval) {
    print(trickMark)
}

while 循环

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

switch

没有隐式贯穿

Object-Cswitch 语句如果不全面,仍然可以运行,但是在 swift 中会报错

相比 CObject-C 里的 switch 语句来说, swift 里的 switch 语句不会默认从匹配 case 的末尾贯穿到下一个 case

相反,整个 switch 语句会在批到第一个 switchcase 执行完毕后退出,不需要显示的 break 语句

  • 每一个 case 的函数体必须要包含至少一个可执行的语句
  • 在一个 switchcase 中匹配多个值可以用逗号分隔,并且可以写成多行

区间匹配

switchcase 的值可以在一个区间中匹配

元组匹配

可以使用元组在一个 switch 语句中测试多个值,使用下划线 _ 来表明匹配所有可能的值

值绑定

  • switchcase 可以将匹配到的值临时绑定为一个常量或者变量,来给 case 的函数体使用
  • 如果使用 var 关键字,临时的变量就会以合适的值来创建并初始化。对这个变量的任何改变都只会在 case 的函数体内有效

where 语句

switch case 可以使用 where 分句来检查是否符合特定的约束

复合匹配

多种情形共享同一个函数体的多个情况可以在case后写多个模式来复合,在每个模式之间用逗号分隔。如果任何一个模式匹配了,那么这个情况都会被认为是匹配的。如果模式太长,可以把它们写成多行

复合匹配同样可以包含值绑定。所有复合匹配的模式都必须包含相同的值绑定集合,并且复合情况中的每一个绑定 都得有相同的类型格式。这才能确保无论复合匹配的那部分命中了,接下来的函数体中的代码都能访问到绑定的值并且值的类型也都相同

控制转移

如果你确实需要C或者Objective一C风格的贯穿行为,你可以选择在switch每个case末尾使用fallthrough关键字

语句标签

可以用语句标签来给循环语句或者条件语句做标记。在一个条件语句中,你可以使用一个语句标签配合break语句来结束被标记的语句。在循环语句中,你可以使用语句标签来配合break或者continue语句来结束或者继续执行被标记的语句


What doesn’t kill you makes you stronger.