有到周末了,我们谈谈控制流的问题那就是使用 if 和 switch 来进行条件操作,使用 for-in 、 for 、 while 和 do-while 来进行循环。包裹条件和循环变量括号可以省略,但是语句体的大括号是必须的。

let DemoScores = [23, 56, 109, 97, 22] 
 var teamScore = 0 
 for score in DemoScores { 
 if score > 50 { 
 teamScore += 3 
 } else { 
 teamScore += 1 
 } 
 } 
 teamScore

在上面的代码中,if score必须是一个布尔表达式——这意味着像 if score { … } 这样的代码将报错,而且避免了其于零的对比。

当我们申明一个可选值的变量的时候,我们可以用 if 和 let 来处理值缺失的情况。有些变量的值是可选的。一个可选的值可能是一个具体的值或者是 nil ,表示值缺失。在类型后面加一个问号来标记这个变量的值是可选的如下代码。

var demoString: String? = “Hi” 
 demoString == nil 
 var demoName: String? = “MyApples” 
 var greeting = “Hello!” 
 if let name = demoName { 
 greeting = “Hello, (name)” 
 }

如上代码当我们声明的变量可选值为nil的时候,条件会自动判断其为 false ,大括号中的代码会被跳过。如果不是 nil ,会将值赋给 let 后面的常量,这样代码块中就可以使用这个值了。

switch可以支持任意类型的数据以及各种比较操作,下面我们就看看它的简单用法吧。

let demotable = “red pepper” 
 switch demotable { 
 case “celery”: 
 let demotableComment = “Add some raisins and make ants on a log.” 
 case “cucumber”, “watercress”: 
 let demotableComment = “That would make a good tea sandwich.” 
 case let x where x.hasSuffix(“pepper”): 
 let demotableComment = “Is it a spicy (x)?” 
 default: 
 let demotableComment = “Everything tastes good in soup.” 
 }

由上我们可以看出不是一种数据类型的比较,并且在switch里如果有满足条件的会制动停止向下运行,不需要break

我们可以使用 for-in 来遍历字典,需要两个变量来表示每个键值对,我们可以根据键找到相应的值。字典是一个无序的集合,所以他们的键和值以任意顺序迭代结束。

let demoNumbers = [ 
 “Prime”: [2, 3, 5, 7, 11, 13], 
 “Fibonacci”: [1, 1, 2, 3, 5, 8], 
 “Square”: [1, 4, 9, 16, 25], 
 ] 
 var largest = 0 
 for (kind, numbers) in demoNumbers { 
 for number in numbers { 
 if number > largest { 
 largest = number 
 } 
 } 
 } 
 largest

下面我们看看while来重复运行一段代码直到不满足条件。循环条件可以在开头也可以在结尾如下带代码:

var i = 2 
 while i < 100 { 
 i = i * 2 
 } 
 ivar j = 2 
 do { 
 j = j * 2 
 } while j < 100 
 j

我们可以在循环中使用 ..< 来表示范围,也可以使用传统的写法,其中这两者是等价的如下代码:

var myLoopFirst = 0 
 for i in 0..<4 { 
 myLoopFirst += i 
 }myLoopFirst 
 var myLoopSecond = 0 
 for var i = 0; i < 4; ++i { 
 myLoopSecond += i 
 } 
 myLoopSecond

我们在使用 ..< 创建的范围不包含上界,但是当我们想包含的话需要使用 … 。