原文地址:http://www.jianshu.com/p/3a8e45af7fdd
直接看代码
func fooManualCheck(x:Int?) {
if x ==nil || x <= 0 {
return
}
x!.description
}
//1.你是在检查一个不符合你期望的条件,而非检查你想要的值。如果你加了一堆像这样的条件判断,代码就变的不好理解。你在这里其实是等着你的条件通不过。
//2.如果前面条件判断的结果不符合了,你还得将你的变量强制拆包。
func fooBinding(x:Int?) {
iflet x = x where x >0 {
//有值使用x
x.description
}
}
//这个函数没有了第一个函数的2个缺陷
//你可以想象在你的代码被执行之前,如果嵌套了好多需要被匹配的条件判断,这会变的多难读懂。
func fooGuard(x:Int?) {
guardlet x = x where x >0 else {
print("1111111")
//变量不符合条件时执行下面代码
return
}
x.description
}
//是对你所期望的条件做检查,而非不符合你期望的。又是和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 语句 你必须考虑条件失败的情况
使用guard 让代码更宜读好维护
也可以看看下面几篇文章
http://swift.gg/2015/08/06/swift-guard-better-than-if/