Hi Swifter:来和Guard问声好吧

陈晓猛

2016-10-02 发表于 2016-10-02 21:34 专题文章

导语: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的转变是巨大的,不仅仅是语法,还有你该怎样去看待你的代码架构。只有你主动的去改变自己的意向,每天扩展你自己的模式和方式,你才会从这个绝妙的新语言中收益。

读者评论

相关博文

  • 社区使用反馈专区

    陈晓猛 2016-10-04

    尊敬的博文视点用户您好: 欢迎您访问本站,您在本站点访问过程中遇到任何问题,均可以在本页留言,我们会根据您的意见和建议,对网站进行不断的优化和改进,给您带来更好的访问体验! 同时,您被采纳的意见和建议,管理员也会赠送您相应的积分...

    陈晓猛 2016-10-04
    4692 705 3 7
  • 迎战“双12”!《Unity3D实战核心技术详解》独家预售开启!

    陈晓猛 2016-12-05

    时隔一周,让大家时刻挂念的《Unity3D实战核心技术详解》终于开放预售啦! 这本书不仅满足了很多年轻人的学习欲望,并且与实际开发相结合,能够解决工作中真实遇到的问题。预售期间优惠多多,实在不容错过! Unity 3D实战核心技术详解 ...

    陈晓猛 2016-12-05
    2883 35 0 1
  • czk 2017-07-29
    4654 28 0 1