5.1 for循环
说明:有两种形式
for-in
for initialization; condition; increment
(c语言形式)
5.1.1 for-in
说明:可以遍历的集合包括
区间
、Array
、Set
、String中的字符
。
- 其中每次循环都会被赋值的常量不需要声明
- 可以使用
_
忽略每个数据项中具体的值- 字典内部是无序的,不经处理不能保证遍历顺序
1 | // 区间 |
5.1.2 C语言形式
语法:标准C样式。
1 | >for initialization; condition; increment { |
1 | for var index = 0; index < 3; ++index { |
5.2 while循环
说明:分两类
while
repeat-while
5.2.1 while
说明:每次在循环开始时计算条件是否符合。
1 | while condition { |
5.2.2 repeat-while
说明:和
while
的区别是在判断循环条件之前,先执行一次循环的代码块,然后重复循环直到条件为false
。
1 | >repeat { |
5.3 条件语句
说明:
if
、switch
if
:当条件较为简单且可能的情况很少时使用switch
:当条件较复杂、可能情况较多且需要模式匹配的情景使用
5.3.1 if
语法:
if-[else]
、if-else if-...-[else]
1 | if condition1 { |
1 | var temperatureInFahrenheit = 90 |
5.3.2 switch
语法:类似C语言
1 | switch some value to consider { |
说明:和C语言的
switch
相比更加强悍。
更安全:
- 每个
case
分支都必须包含至少一条语句case
和default
必须包含所有可能的情况,否则报错- 当匹配的
case
分支中的代码执行完毕,switch
终止(不需要手动break
)更强大:
case
可以包含多个模式,用,
分隔case
分支的模式可以是:区间
、元组
- 允许多个
case
匹配到一个值,但执行时只有最前面的被匹配到的分支会执行- 值绑定
where
case
多个模式
用途:多个值匹配到一种
case
中。
1 | let someCharacter: Character = "e" |
区间
1 | let approximateCount = 62 |
元组
1 | let yetAnotherPoint = (1, -1) |
值绑定
说明:在
case
分支的模式将匹配的值绑定到一个临时的常量或变量,然后就可以在分之内使用这些常量或变量。
1 | let anotherPoint = (2, 0) |
where
表达式
说明:
case
分支的模式可以使用where语句来判断额外的条件。
1 | let yetAnotherPoint = (1, -1) |
5.4 控制转移语句
说明:Swift 有
5
种控制转移语句
continue
break
fallthrough
return
throw
5.4.1 continue
说明:告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
1 | let puzzleInput = "great minds think alike" |
5.4.2 break
说明:立刻结束整个控制流的执行。
switch语句中的break
背景:
switch
的完备性使所有值的情况都要求有对应的分支(但是有的分支內并不需要执行任何代码)
说明:立即结束switch
代码块
用途:用来匹配或者忽略一个或多个分支
1 | let numberSymbol: Character = "三" // 简体中文里的数字 3 |
5.4.3 fallthrough
说明:使代码执行继续到下一个
case
中的执行代码
1 | let integerToDescribe = 5 |
5.4.4 标签
说明:配合
continue
或break
实现跳转。适用的语句包括
while
、repeat-while
for
switch
语法:以
while
为例子
1 | label name: while condition { |
1 | //寻找二维数组中的特殊值 |
5.5 提前退出
说明:条件为真时,执行
guard
语句后的代码;不为真则执行else
分句中的代码。
- 一个
guard
语句总是有一个else
分句else
分支必须通过return
、break
、continue
、throw
,或者调用一个不返回的方法或函数(比如fatalError
函数)来退出guard
所在的代码段。用途:相比于可以实现同样功能的if语句,按需使用
guard
语句会提升我们代码的可靠性和可读性。
1 | func greet(person: [String: String]) { |
5.6 检测API是否可用
用途:确保我们不会不小心地使用对于当前部署目标不可用的 API。
语法:最后一个参数*
是必须写的,用于处理未来潜在的平台。
1 | if #available(platform name version, ..., *) { |
说明:平台名字可以是
iOS
,OSX
或watchOS
,除了特定的主板本号像iOS 8
,我们可以指定较小的版本号像iOS 8.3
以及OS X v10.10.3
。
- 编译器使用从可用性条件语句中获取的信息去验证在代码块中调用的
API
是否都可用- 根据步骤
1
,在一个if
或guard
语句中去有条件的执行一段代码
1 | if #available(iOS 9, OSX 10.10, *) { |