The Swift Programming Language学习笔记(六)——控制流
控制流Swift提供了类似C语言的流程控制结构,包括可以多次执行任务的 除了C语言里面传统的for循环,Swift还增加了 Swift的 for循环Swift提供了两种
for-in使用 for i in 1...5 {
print("(i)",terminator: "-")
}
上面的 如果你不需要知道区间序列内每一项的值,你可以使用下划线( for _ in 0..<5 {
print("Hello")
}
使用 let a = [1,2,3]
for i in a { // 注意:文档上说i是常量,但是貌似只能写var不能写let
print(i)
}
let b = ["A": 1,"B": 2,"C": 3]
for var (k,v) in b { // 注意:文档上说k和v是常量,但是貌似只能写var不能写let
print("(k) => (v)") }
for除了 for var i = 0; i < 3; ++i { // 注意:此时的var必须写,而且不能写成let
print(i)
}
在初始化表达式中声明的常量和变量(比如 while循环这类循环适合使用在第一次迭代前迭代次数未知的情况下。Swift提供两种
while
/** * 文档上的蛇和梯子的小游戏,也叫做滑道和梯子 */
let finalSquare = 25
var board = [Int](count: finalSquare + 1,repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
while square < finalSquare {
// 掷骰子
if ++diceRoll == 7 { diceRoll = 1 }
// 根据点数移动
square += diceRoll
if square < board.count {
// 如果玩家还在棋盘上,顺着梯子爬上去或者顺着蛇滑下去
square += board[square]
}
}
print("Game over!")
print("最终位置是(square)。") // 最终位置是27。
repeat-while它和 /** * 文档上的蛇和梯子的小游戏,也叫做滑道和梯子 */
let finalSquare = 25
var board = [Int](count: finalSquare + 1,repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
repeat {
// 顺着梯子爬上去或者顺着蛇滑下去
square += board[square]
// 掷骰子
if ++diceRoll == 7 { diceRoll = 1 }
// 根据点数移动
square += diceRoll
} while square < finalSquare
print("Game over!")
print("最终位置是(square)。") // 最终位置是27。
可以看出,此时 条件语句Swift提供两种类型的条件语句: if
let a = 10
if a < 10 {
print("a < 10")
} else if a > 10 {
print("a > 10")
} else {
print("a == 10")
}
switch
不存在隐式的贯穿与C语言和Objective-C中的 虽然在Swift中 每一个 case 分支都必须包含至少一条语句,避免了意外地从一个case分支贯穿到另外一个,使得代码更安全、也更直观。 一个case也可以包含多个模式,用逗号把它们分开(如果太长了也可以分行写)。 let a = 1
switch a {
// case 0: // 每个case分支不能有空语句
case 1:
print("1")
case 2,3:
print("2 or 3")
default: // 此时switch还不完备,因此必须有default分支
print("Error")
}
区间匹配case 分支的模式也可以是一个值的区间。 闭区间操作符( let a = 1
switch a {
case 0...1:
print("0 ~ 1")
case 2..<10:
print("2 ~ 9")
default: // 必须有default分支
print("other")
}
元组可以使用元组在同一个 let a = (1,1)
switch a {
case (0,0):
print("在原点")
case (_,0):
print("在x轴")
case (0,_):
print("在y轴")
case (-1...1,-1...1):
print("在格子里") // 在格子里
default:
print("在格子外")
}
let b = (0,0)
switch b {
case (0,0):
print("在原点") // 在原点,优先匹配上!
case (_,-1...1):
print("在格子里")
default:
print("在格子外")
}
不像C语言,Swift允许多个case匹配同一个值。实际上,在这个例子中,点(0,0)可以匹配所有四个case。但是,如果存在多个匹配,那么只会执行第一个被匹配到的case分支。考虑点(0,0)会首先匹配case(0,0),因此剩下的能够匹配(0,0)的case分支都会被忽视掉。 值绑定case分支的模式允许将匹配的值绑定到一个临时的常量或变量,这些常量或变量在该case分支里就可以被引用了——这种行为被称为值绑定(value binding)。 let a = (0,1)
switch a {
case (let x,0):
print("1、(x)")
case (0,let x):
print("2、(x)") // 2、1
case let (x,y):
print("3、(x),(y)") // 不需要default,因为已经完备
}
let b = (3,0)
switch b {
case (let x,0): // 1、3
print("1、(x)")
case (0,let x):
print("2、(x)")
case let (x,(y)")
}
let c = (23,-12)
switch c {
case (let x,(y)") // 3、23,-12
}
let d = (0,0)
switch d {
case (let x,0):
print("1、(x)") // 1、0
case (0,(y)")
}
这三个case都声明了常量 第一个 这个 这里x和y是常量,这是因为没有必要在其对应的 where
let a = (1,-1)
switch a {
case let (x,y) where x == y:
print("x == y")
case let (x,y) where x == -y:
print("x == -y") // x == -y
case let (x,y): // 已经完备,无需default
print(a)
}
上面声明的常量 控制转移语句控制转移语句改变你代码的执行顺序,通过它你可以实现代码的跳转。Swift有五种控制转移语句
continue
在一个带有条件和递增的 break
循环语句中的break当在一个循环体中使用 switch语句中的break当在一个 这种特性可以被用来匹配或者忽略一个或多个分支。因为Swift的 注意:当一个 fallthrough如果你确实需要C风格的贯穿的特性,你可以在每个需要该特性的
let a = 3
switch a {
case 0, 1, 2:
print("0 ~ 2")
case 3..<100:
print("3 ~ 100") // 3 ~ 100
fallthrough
default:
print("Over") // Over
}
带标签的语句在Swift中,你可以在循环体和 可以使用标签来标记一个循环体或者 /** * 文档上的蛇和梯子的小游戏,也叫做滑道和梯子。 * 现在增加一个条件:为了获胜,你必须刚好落在第 25 个方块中。即如果某次掷骰子使你的移动超出第 25 个方块,你必须重新掷骰子,直到你掷出的骰子数刚好使你能落在第 25 个方块中。 */
let finalSquare = 25
var board = [Int](count: finalSquare + 1,repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
gameLoop: while square != finalSquare {
if ++diceRoll == 7 { diceRoll = 1 }
switch square + diceRoll {
case finalSquare:
// 到达最后一个方块,游戏结束
print(square + diceRoll)
break gameLoop
case let newSquare where newSquare > finalSquare:
// 超出最后一个方块,再掷一次骰子
print("square = (square),diceRoll = (diceRoll)")
continue gameLoop
default:
// 本次移动有效
square += diceRoll
square += board[square]
}
}
print("Game over!")
/* 过程是:23+1 => 24-8 => 16+2 => 18+3 => 21+4 => 25 square = 23,diceRoll = 4 square = 23,diceRoll = 5 square = 23,diceRoll = 6 25 Game over! */
提前退出像 如果 如果条件不被满足,在 相比于可以实现同样功能的 let a = 10
/*
guard a < 5 else { // error: 'guard' body may not fall through,consider using 'return' or 'break' to exit the scope
print("a >= 5")
}
*/
while true {
guard a < 5 else {
print("a >= 5") // a >= 5
break // 必须写break,否则报上面的错误
}
}
print("...")
检测API可用性Swift有检查API可用性的内置支持,这可以确保我们不会不小心地使用对于当前部署目标不可用的API。 编译器使用SDK中的可用信息来验证我们的代码中使用的所有API在项目指定的部署目标上是否可用。如果我们尝试使用一个不可用的API,Swift会在编译期报错。 我们使用一个可用性条件在一个 if #available(iOS 9,OSX 10.10,*) {
print("iOS 9+ or OS X 10.10+") // 条件是或的关系,有一个平台满足就可以,表示指定了在iOS系统上,if段的代码仅会在iOS 9及更高版本的系统上执行;在OS X,仅会在OS X v10.10及更高版本的系统上执行。
} else {
print("old version")
}
可用性条件指定了在iOS系统上,if段的代码仅会在iOS 9及更高版本的系统上执行;在OS X,仅会在OS X v10.10及更高版本的系统上执行。上面的最后一个参数 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |