一、前言
本文主要介绍Swift 2新特性,里边的guard关键词。请看下面两个方法,一个good,一个bad。为什么用guard的那个方法就是good的呢?
// Good
func fooNonOptionalGood(x: Int) {
guard x > 0 else {
// x 不大于零
return
}
// x 大于零
}
// bad
func fooNonOptionalBad(x: Int) {
if x <= 0 {
// x 不大于零
return
}
// x 大于零
}
二、解释
1、关键词“guard”是什么
// 如果不符合“x > 0”,即x <= 0,则执行花括号。
guard x > 0 else {
// some Syntax
return
}
第一次看到guard的时候,就会让人觉得,“诶,为什么要用 guard,用 if 不是好了吗?因为 guard 和 if 功能差不多呀,改成“if x <= 0”不就可以了吗,干嘛大费周章弄一个guard?
2、深入发掘
看一个判断正数的例子:
func fooPositiveCheck(x: Int?) {
// 不是正数
if x == nil || x <= 0 {
print("不是正数")
return
}
// 是正数
print("是正数")
x!.description
}
这是OC最基本的判断方法,看起来没什么问题,很不错的写法呀~
但是,有两个缺点:
1、我们是判断“正数”,但是上面的方法是在判断“不是正数”的情况下,返回。如果这样的语句多了的话,容易令人困惑,因为明明想判断正数,但非要反过来,判断不是正数,然后返回。
2、如果是正数,还要解包optional的值x。(x!)
Swift 早期已经提供了Optional Binding(绑定):
func fooBinding(x: Int?) {
if let x = x where x > 0 {
print("是正数")
x.description
}
print("不是正数")
}
上面的Swift方法就解决了之前OC那个方法的两个缺点,但同时产生了另一个新的缺点:
——把你想实现的代码写在了判断嵌套里面,而不是外边;如果这样的语句多了,容易令人产生困惑。
func fooGuard(x: Int?) {
guard let x = x where x > 0 else {
print("不是正数")
return
}
print("是正数")
// 自动解包(不用x!)
x.description
}
用 guard 解决了以上的三个缺点:
1、判断:你想要的,而不是:不想要的。[判断正数:想要的——正数(x>0);不想要的——非正数(x<=0)];
2、自动解包;
3、检查判断在前,使得你的方法更合理,也更容易地维护。
三、参考文章
ecerney:《Swift Guard Statement》
其他文章
Greg Heo:《What’s New in Swift 2》
jopen:《Swift 2 有哪些新特性[译]》