为什么警卫声明是裴

Guard语句解决了诸如“厄运金字塔”之类的问题,并将许多条件填充到一个条件(如果有条件的话),这可能在出现错误或错误时引起很多混乱。 警卫还使验证数据更安全!

去年夏天,我承担了调试使用保护语句的程序的任务。 我对自己说:“警卫的言论到底是什么?”。 很好奇,我搜寻了更多关于它们的信息。 最初,我对为什么会使用它感到困惑,但是当我开始使用Swift开发时,我看到了它们的好处以及它们的优点。

根据Apple的Swift编程语言, 如果不满足一个或多个条件则使用保护声明将程序控制权移出作用域。 基本上,您可以将它们视为if语句,但它们会正常退出。

在Swift 3中,guard语句如下所示:

 警卫条件其他{ 
声明
return / break / continue / throw //使用其中之一
}

与if语句不同,guard语句不仅可以帮助我们尽早安全地退出程序。 它可以验证数据,同时使我们的代码更整洁,更易于阅读。 如果我们正在处理可选选项,则警卫声明将为我们安全地解开它们。

为了更好地了解bae及其优点,我们来看一些示例:

如果有条件:

假设我们有一个Pokedex,其中包含我们已经看到并捕获的所有Pokemon。 我懒得手动计算遇到的次数,所以我决定编写此程序来为我们检查一下。

使用if语句:

  //示例1 
func checkPokeDex(pokedex:[String]?){
如果让pokedex = pokedex,则pokedex.count <151 {
打印(“您尚未看到足够的口袋妖怪”)
返回
}
}

它可以工作,但是让我们通过添加更多参数来想象此功能是否更复杂:

  //示例2(将示例1想象得更复杂) 
func checkPokeDex(pokedex1:[String] ?, pokedex2:[String] ?, pokedex3:[String] ?, pokedex4:[String] ?, pokedex5:[String]?){
如果让pokedex1 = pokedex1,pokedex1.count <151 &&让pokedex2 = pokedex2,pokedex2.count <251 &&让pokedex3 = pokedex3,pokedex3.count <202 &&让pokedex4 = pokedex4,pokedex4.count <151&让pokedex5,pokedex5 pokedex5.count <155 {
打印(“您尚未看到足够的口袋妖怪”)
返回
}
}

该功能有效,但是存在一个缺陷:

我们使此函数越复杂,它将在运行您的语句之前变得更加混乱。

使用警卫声明,我们可以解决此缺陷! 修改示例1,我们的代码现在如下所示:

  //修订示例1 
func checkPokeDex(pokedex:[String]?){
警卫让pokedex = pokedex,pokedex.count> = 151 else {
打印(“您尚未看到足够的口袋妖怪”)
返回
}
打印(“您已经看过151个神奇宝贝!”)
}

现在,我们正在检查通缉令,如果我们遇到恰好或超过151个神奇宝贝,它将早日安全返回。 即使我们使此功能更加复杂,但guard语句仍可以使我们尽早退出。

厄运金字塔:

现在,让我们看看厄运金字塔。 “厄运金字塔”是指函数中嵌套的语句过多的情况。

 功能 
-如果声明
-如果声明
-如果语句
---- //做某事
 等等 

从上面可以看到,函数嵌套的越多,到达语句之前必须满足的条件越多。 保护声明破坏了此金字塔并使它更干净使用。

让我们来看这个例子:

假设大学x为学生提供了继续交流的机会。 符合交换条件的要求如下:

  • 必须年满20岁
  • 最低GPA必须为3.0
  • 目前必须至少在他们的第二年学习
  //示例3 
funcquallyForExchange(age:Int ?, gpa:Double ?, year:Int?){
如果让年龄=年龄,年龄> = 20 {
如果让gpa = gpa,gpa> = 3.0 {
如果让year = year,year> = 2 {
//做点什么
}其他{
//做点什么
}
}其他{
//做点什么
}
}其他{
//做点什么
}
}

如您所见,该函数非常嵌套,必须通过许多条件。 一些不必要的。 假设我们有一个21岁的人,其GPA值为3.1,并且正在学习的第一年。 前两个条件将通过,但最后一个条件将不通过。 不幸的是,该程序在失败时没有尽早返回。 幸运的是,我们可以通过分解嵌套级别以使用保护语句来解决此问题。 在此示例中,您可以看到我们正在处理可选的Int。 如前所述,guard可以解开可选内容,并且该值将保持未包装状态。 这将使我们的代码更干净,更易读。

  //修订示例3 
func qualityForExchange(age:Int ?, gpa:Double ?, year:Int?){
警卫让年龄=年龄,年龄> = 20否则{
//做点什么
返回
}
守卫让gpa = gpa,gpa> = 3.0 else {
//做点什么
返回
}
后卫让year = year,year> = 2 else {
//做点什么
返回
}
打印(“您有资格!”)
}

如果您不满足任何条件,它将在不检查其余语句的情况下早日安全返回。 如果您符合条件,它将打印出“您符合条件!”声明。 这比拥有金字塔要干净和好得多。

总而言之,guard语句对于验证数据(如果不符合条件将在早期失败)非常有用。 这使程序可以安全地提前退出。 特别是在iOS开发中,这是一个很棒的声明,这就是为什么我说它是bae!

更正:感谢 Kenneth Trueman 纠正了示例3中的错误。