Swift正逐步占领iOS App实际开发的市场份额,Swift 的简洁、易用性已经吸引了大量开发者,大家已开始或准备开始使用Swift开发iOS App。
Swift 2.0 带来了令人激动的guard语句。但很多人还是不太理解guard的意义,特别是和 Swift 2.0 之前的简单if语句相比较。
与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。你可以把guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。
Swift 2 新增的guard 语句
guard 语句和if 语句有点类似,都用于对表达式条件进行判断,根据表达式执行分支。与if 语句不同的是,guard 语句总是只有一个else 代码块,当guard 条件为false 时,程序就执行guard 语句的else 块。
guard 语句的语法格式如下:
正如上面语法格式中所看到的,在 guard 语句的else 块中必须有return、break、continue或throw 语句来跳出guard 语句所在的代码块,当然也可以调用如fatalError()直接终止程序执行的函数—总之,else 块里必须有终止语句来跳出guard 语句所在的块。
下面程序示范了 guard 语句的简单用法。
正如上面程序中所看到的,程序使用 guard 语句判断a 是否小于10,如果a 不小于10,程序就会执行guard 语句的else 块,else 块使用fatalError()函数来终止程序执行。
guard 语句也可以出现在函数或闭包中,此时guard 语句的else 块可以使用return 等语句跳出guard 所在的代码块;guard 语句还可以出现在分支、循环的代码块内,此时guard 语句的else 块可以使用break 等语句跳出guard 所在的代码块。
例如,如下程序。
正如上面代码中所看到的,guard 语句位于for 循环内,guard 语句用于判断i 是否小于5,当i 不小于5 时,程序执行guard 语句的else 块,else 块中的break 语句即可跳出for 循环。
通过上面两个示例的介绍,读者不难发现:guard 语句与if 语句非常相似,甚至看不出guard语句的优势。这是为什么呢?这就涉及guard 的作用和使用场景的问题了。guard 语句的作用是“守护”后面的代码,只有当 guard 语句中Bool 条件为true 时才能执行被“守护”的语句(位于guard 之后的语句),当Bool 条件为false 时,程序就会进入执行guard 语句的else 块,而else 块则保证跳出guard 语句所在的代码块。
很多时候,guard 语句都用于处理可选绑定—使用guard 语句保证可选类型有值。例如,如下程序。
上面程序中 guard 语句出现在test()函数中,guard 语句的作用是保证程序调用test()函数时传入的参数不为nil。如果程序传入的参数为nil,guard 语句中的可选绑定失败,程序执行else块,而else 块中的 return 语句将会跳出test()函数;如果调用test()函数传入的参数不为nil,则guard 可选绑定成功,程序可以直接执行guard 语句之后的代码—此时,可选绑定一定是成功的,这就保证了传入的参数一定不是nil。
从Objective-C到swift的转变是巨大的,不仅仅是语法,还有你该怎样去看待你的代码架构。只有你主动的去改变自己的意向,每天扩展你自己的模式和方式,你才会从这个绝妙的新语言中收益。