阅读本文时,我注意到使用Guard的巨大好处
在这里,您可以将guard的使用与一个示例进行比较:
这是没有防护的部分:
func fooBinding(x: Int?) {
if let x = x where x > 0 {
// Do stuff with x
x.description
}
// Value requirements not met, do something
}
在这里,您将所需的代码置于所有条件下
您可能不会立即看到此问题,但是您可以想象,如果在执行语句之前嵌套了许多必须满足的条件,那么它会变得多么混乱
清理的方法是先进行每项检查,然后在未满足要求时退出。这样可以轻松了解导致此功能退出的条件。
但是现在我们可以使用Guard了,我们可以看到可以解决一些问题:
func fooGuard(x: Int?) {
guard let x = x where x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
x.description
}
- 检查您想要的条件,而不是您不想要的条件。这又类似于断言。如果不满足条件,则运行guard的else语句,该语句会中断该功能。
- 如果条件通过,此处的可选变量将在调用Guard语句的范围内自动为您解包-在这种情况下,为fooGuard(_ :)函数。
- 您正在及早检查不良情况,使您的功能更具可读性,更易于维护
对于非可选值,同样的模式也适用:
func fooNonOptionalGood(x: Int) {
guard x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
}
func fooNonOptionalBad(x: Int) {
if x <= 0 {
// Value requirements not met, do something
return
}
// Do stuff with x
}
如果您还有任何疑问,可以阅读整篇文章:Swift Guard声明。
包起来
最后,通过阅读和测试,我发现如果您使用保护罩来打开任何可选组件,
这些未包装的值留在您的代码块的其余部分中供您使用
。
guard let unwrappedName = userName else {
return
}
print("Your username is \(unwrappedName)")
在这里,展开的值仅在if块内可用
if let unwrappedName = userName {
print("Your username is \(unwrappedName)")
} else {
return
}
// this won't work – unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")