控制流(Control Flow)
我不想这么译的。。。我更想叫控制语句,但是想想,这么叫也没错,意指流程控制。
大部分用法跟C类似
switch
不是必须用break了,因为在C里面太常见的错误就是忘记加break导致奇怪问题的发生
case在Swift中增强了功能,可以用范围表示,也可以用元组,值的类型也可以是混杂的
for循环
for-in 这个我们已经见过很多了
for-condition-increment 类似C里的用法
for var index = 0; index < 3; ++index {
println(“index is \(index)")
}
或者:
var index:Int
for index = 0; index < 3; ++index {
println(“index is \(index)")
}
while循环
var count = 0
var index = 10
while index > 0 {
count += index
--index
//这里很有趣,如果这句忘记写的话,playground的右边的数字会一直加一直加。。。。
}
println(count)
或者
do {
count += index
--index
} while index > 0
println(count)
条件语句
if…{} else {} 前面已经见过了
switch值得说说:
直接帖官方的例子
这里要说的是,swfit依然是大小写敏感的!
let count = 15
switch count {
case 0:
xxx
case 1
…10:
xxx
case 11
…20:
xxx
default:
xxx
}
let myPoint = (1, 3)
switch myPoint {
case (0, 0):
xxx
case (
_, 0):
xxx
case (1,
_):
//所有的第1个为1的元组,都会被捕捉到
xxx
default:
xxx
}
接下来更神奇的来了。。。:
let myPoint = (2, 0)
switch myPoint {
case (let x, 0):
xxxx
case (0, let y):
xxxx
case let (x, y):
xxxx
}
这种奇怪的方式,还挺有用的感觉,既定义了变量,又保存了数值,第一个case,匹配所有的y=0的point,如果x和y都不是0的话,自然就匹配到了第三个case,而且,第三个case是不用分别给x,y写let的。。。
switch的where子句
更有意思的是,case里可以写where。。。可能这是因为在case里可以定义变量并赋值,而带来的方便用法吧:
let myPoint = (1, -1)
switch myPoint {
case let (x, y) where x == y:
xxx
case let (x, y) where x == -y:
xxx
case let (x, y):
xxx
}
不多解释了,名如其字
Control Transfer Statement
continue
break
fallthrough
return
continue,break, return 常规的用法就不说了,fallthroug...这个诡异的东西,从名字以及之前提到的switch并不是非要写break可以看出来,他是来让case执行完之后继续执行下一个case的东西,直接帖官方的例子:
那么,我们还是来看看 continue和break的新坑爹玩法吧.
苹果在这个新坑爹玩法之前,引入了一个新东西:Labeled Statements
(感谢群友Shawn·Shoper的更正,这个玩意在java和go里都已经有了)
所谓的Labeled Statements就是给代码的某个地方打个标签,然后之后用某种方法再跳回到标签位置。。。是不是听起来像某些语言里的goto语句。。。
myLabel: while xxx {
switch xx {
case xxx:
break myLabel
case xxx:
continue myLabel
default:
xxx
}
}