如果保护和反转有什么不同

时间:2016-06-23 08:37:49

标签: ios swift optional

很抱歉,如果这是一个菜鸟问题,因为我是Swift的新手并且无法从Google找到这个答案。

当我第一次看到后卫时,我想到用其他编程语言反转if

var optString: String?
guard optString != nil else { return }
if optString == nil { return }

第二行和第三行不会产生相同的结果吗?

我理解if let使代码更简单,而不是检查nil并解开它,但guard的目的是什么?根据我的研究,我只能找到人们说它可以减少嵌套if,反转if可以做同样的事情。

  

编辑:我问的是反转if if let。请阅读   标记之前的问题。

4 个答案:

答案 0 :(得分:6)

guard有两个重要的事项,即倒置if(或if let)没有:

  • guard必须有else条款,必须有return语句或其他方式离开警卫的父范围(例如throwbreak)。
  • guard声明并由guard分配的变量可在guard的父作用域中使用。

if let的重点在于它允许你避免繁琐的构造,如guard optString != nil else { return } body继续到方法的结尾,因为代码必须只在可选的一些解包成功时执行。基本上,它是一种更清晰的方式来实现提前退出。

因此,要回答您的直接问题,是if optString == nil { return }相当于guard,但这不是guard引入的内容:

  

与使用if语句进行相同检查相比,对需求使用else语句可提高代码的可读性。它允许您编写通常执行的代码而不将其包装在{{1}}块中,并且它允许您保留处理需求旁边违反要求的代码。

来源:Apple's documentation

答案 1 :(得分:3)

是的,这两行在功能上是等效的,并产生相同的结果。

guard被认为是更好的做法,因为该计划必须退出其else原因中的范围。

这会产生错误:

guard optString != nil else { // no return statement }

但这不是:

if optString == nil { // no return statement }

答案 2 :(得分:0)

在编程语言中,您几乎总能以多种方式完成任务。

但与完成工作一样重要的是尽可能好地完成工作。

使用guard语句告诉未来的维护者声明的目的是什么。

因此,保护​​声明绝对不会与倒置的if语句相同。

另请参阅:http://ericasadun.com/2015/12/29/migrating-ifs-to-guards-in-swift/

答案 3 :(得分:0)

根据Apple文件:

"如果不满足一个或多个条件,则使用保护声明将程序控制转移到范围。"

我们不仅有一种可能性超出范围return,但我们有4种可能性:

  • return:stop current function / block
  • break:停止当前循环
  • 继续:停止当前轮次并进入下一轮循环
  • throw:停止当前函数/块并抛出错误。

您的第2行和第3行具有相同的结果,因为它会通过scope命令停止return