Swift的Guard语句
2016-04-21 09:59
162 查看
本篇文章翻译自:
http://ericcerney.com/swift-guard-statement/
原作者:ecerney
原文章发布于2015-06-10
*译者注:该语法为swift2.0新特性,目前(2015-07-30)仅xcode 7 beta支持,xcode6并不支持。
最开始在Apple的Platform State of the Union看见swift的guard语句的时候,我当时不太理解以后会有什么理由能用到它。这个语句的介绍如下:
与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。你可以把guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。
即使看了一些例子,我还只是认为这不过是一种更让人困惑的方式,实现我们早已经能够用可选绑定(optional binding)或者单独的if-else语句实现的目的。
直到我开始在Twitter conversation讨论关于这个语句的时候,我才意识到这个语法真的有一些
非常有意思的优点。
Swift Guard保镖
这是最基本的Objective-C方式来保证一个变量真的存在并符合一个条件。没什么大问题,但是有一些缺点:
你是在检查一个不符合你期望的条件,而非检查你想要的值。如果你加了一堆像这样的条件判断,代码就变的不好理解。你在这里其实是等着你的条件通不过。
如果前面条件判断的结果不符合了,你还得将你的变量强制拆包。
Swift通过可选绑定让问题变得简单了一些,并解决了上面的部分缺点:
这个函数没有了第一个函数的2个缺陷,但引入了一个新的。你把你要写的代码都放在了所有条件判断中,而不是之后。你可能不会马上意识到这个问题,但是你可以想象在你的代码被执行之前,如果嵌套了好多需要被匹配的条件判断,这会变的多难读懂。
对此的解决方法是先对每个条件逐一做检查,如果不符合条件判断就退出。这就会让人容易看出来什么条件会让这个函数退出。
我听说过这个叫保镖模式(Bouncer Pattern),这个模式十分的合理。你要在坏情况进门之前把它们挡出去。这让你每次只考虑一种情况,而不用去搞清楚如何同时将所有的条件判断安排在一起。
这就是guard语句:
使用guard语句将上述的3个问题一并解决:
是对你所期望的条件做检查,而非不符合你期望的。又是和assert很相似。如果条件不符合,guard的else语句就运行,从而退出这个函数。
如果通过了条件判断,可选类型的变量在guard语句被调用的范围内会被自动的拆包 - 这个例子中该范围是fooGuard函数内部。这是一个很重要,却有点奇怪的特性,但让guard语句十分实用。
对你所不期望的情况早做检查,使得你写的函数更易读,更易维护。
对非可选类型的变量这种用法也是奏效的:
从Objective-C到swift的转变是巨大的,不仅仅是语法,还有你该怎样去看待你的代码架构。只有你主动的去改变自己的意向,每天扩展你自己的模式和方式,你才会从这个绝妙的新语言中收益。
发现了什么其他好玩的东西就告诉我,这个语法对我来说也是新的。
文/ray16897188(简书作者)
原文链接:http://www.jianshu.com/p/3a8e45af7fdd
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
http://ericcerney.com/swift-guard-statement/
原作者:ecerney
原文章发布于2015-06-10
*译者注:该语法为swift2.0新特性,目前(2015-07-30)仅xcode 7 beta支持,xcode6并不支持。
最开始在Apple的Platform State of the Union看见swift的guard语句的时候,我当时不太理解以后会有什么理由能用到它。这个语句的介绍如下:
与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。你可以把guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。
即使看了一些例子,我还只是认为这不过是一种更让人困惑的方式,实现我们早已经能够用可选绑定(optional binding)或者单独的if-else语句实现的目的。
直到我开始在Twitter conversation讨论关于这个语句的时候,我才意识到这个语法真的有一些
非常有意思的优点。
Swift Guard保镖
具体细节
让我们用一个简单的对比来比较一下现在的写法和用全新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 }
总结
希望上面这个简单的例子告诉你可以马上在你的swift代码中使用guard,从而让你的函数/方法更清楚。对我们来说评判一个新的特性很容易,只要去试一下,看看它对你来说有用没用。从Objective-C到swift的转变是巨大的,不仅仅是语法,还有你该怎样去看待你的代码架构。只有你主动的去改变自己的意向,每天扩展你自己的模式和方式,你才会从这个绝妙的新语言中收益。
发现了什么其他好玩的东西就告诉我,这个语法对我来说也是新的。
文/ray16897188(简书作者)
原文链接:http://www.jianshu.com/p/3a8e45af7fdd
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- Swift方法参数名称省略
- swift 学习计划(一)Array 数组、Dictionary 字典
- Swift 通过出生日期的字符串计算年龄
- Swift柯里化(Currying)
- 三点...和两点加箭头..<的含义和区别
- Swift之 ? , !, as
- swift 的迭代与递归
- oc swift 交互
- swift笔记(二) —— 运算符
- Swift集成极光推送
- Swift - 修改导航栏的样式(文字颜色,背景颜色,背景图片)
- Top 10 Swift的第三方库
- Swift 封装UIView
- swift 中常用的进制转换
- AFNetworking配合Swift3.0请求数据
- Swift 正则表达式 验证手机号、邮箱、URL等
- Swift URL Schemes使用
- Swift报错type ''does not conform to protocol 'UITableViewDataSource'
- 在项目里交叉使用Swift和OC
- swift 小技巧进阶