风骚的Guard语法
来源:互联网 发布:connect佳明软件 编辑:程序博客网 时间:2024/06/05 17:04
Swift 2.0 带来了令人激动的guard
语句。但很多人还是不太理解guard
的意义,特别是和 Swift 2.0 之前的简单if
语句相比较。
为什么guard
就是比if
要好呢?
与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。你可以把guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。
具体细节
让我们用一个简单的对比来比较一下现在的写法和用全新guard语句的写法:
func fooManualCheck(x: Int?) { if x == nil || x <= 0 { // 不符合值的要求时,写点代码 return } // 使用x x!.description}
这是最基本的Objective-C方式来保证一个变量真的存在并符合一个条件。没什么大问题,但是有一些缺点:
- 你是在检查一个不符合你期望的条件,而非检查你想要的值。如果你加了一堆像这样的条件判断,代码就变的不好理解。你在这里其实是等着你的条件通不过。
- 如果前面条件判断的结果不符合了,你还得将你的变量强制拆包。
Swift通过可选绑定让问题变得简单了一些,并解决了上面的部分缺点:
func fooBinding(x: Int?) { if let x = x where x > 0 { // 使用x x.description } // 如果值不符合条件判断,就执行下面的代码}
这个函数没有了第一个函数的2个缺陷,但引入了一个新的。你把你要写的代码都放在了所有条件判断中,而不是之后。你可能不会马上意识到这个问题,但是你可以想象在你的代码被执行之前,如果嵌套了好多需要被匹配的条件判断,这会变的多难读懂。
对此的解决方法是先对每个条件逐一做检查,如果不符合条件判断就退出。这就会让人容易看出来什么条件会让这个函数退出。
我听说过这个叫保镖模式(Bouncer Pattern),这个模式十分的合理。你要在坏情况进门之前把它们挡出去。这让你每次只考虑一种情况,而不用去搞清楚如何同时将所有的条件判断安排在一起。
这就是guard语句:
func fooGuard(x: Int?) { guard let x = x where x > 0 else { // 变量不符合条件判断时,执行下面代码 return } // 使用x x.description}
使用guard语句将上述的3个问题一并解决:
- 是对你所期望的条件做检查,而非不符合你期望的。又是和assert很相似。如果条件不符合,guard的else语句就运行,从而退出这个函数。
- 如果通过了条件判断,可选类型的变量在guard语句被调用的范围内会被自动的拆包 - 这个例子中该范围是fooGuard函数内部。这是一个很重要,却有点奇怪的特性,但让guard语句十分实用。
- 对你所不期望的情况早做检查,使得你写的函数更易读,更易维护。
对非可选类型的变量这种用法也是奏效的:
func fooNonOptionalGood(x: Int) { guard x > 0 else { // 变量不符合条件判断时,执行下面代码 return } // 使用x}func fooNonOptionalBad(x: Int) { if x <= 0 { // 变量不符合条件判断时,执行下面代码 return } // 使用x}
再给一个示例对比,使用guard和if
总结
希望上面这个简单的例子告诉你可以马上在你的swift代码中使用guard,从而让你的函数/方法更清楚。
- 风骚的Guard语法
- 风骚的strlen
- 风骚的Toast
- 风骚的lambda
- NavigationView如此风骚的控件
- Swift语法之 guard
- swift Guard语法
- swift 为什么设计 guard 语法?
- 这些话真的很风骚....
- 程序员也有风骚的青春
- 风骚裙摆--最后的内存池
- erlang判断语法结构:if/case/guard
- DATA GUARD的概述
- guard的体系结构
- 【codevs1279】Guard 的无聊
- Swift的Guard语句
- Swift的Guard语句
- swift的Guard语句
- 2.WebService的开发手段
- 共享你的XMind6思维导图
- 设置div字体
- Android:EditText 多行显示及所有属性
- iOS后台保持(whose view is not in the window hierarchy)
- 风骚的Guard语法
- HDFS的快照原理和Hbase基于快照的表修复
- 在自定义View中使用自定义属性
- SQLite数据库学习笔记
- Delphi新语法 For ..In
- 【bzoj3524】【poi2014】【couriers】【可持久化线段树】
- 【Linux导论】Linux文件系统基础(Linux Filesystem Basics)
- 如何在App中实现朋友圈功能之八页面加载功能的逻辑与实现——箭扣科技Arrownock
- Docker数据管理