很抱歉,如果这是一个菜鸟问题,因为我是Swift的新手并且无法从Google找到这个答案。
当我第一次看到后卫时,我想到用其他编程语言反转if
。
var optString: String?
guard optString != nil else { return }
if optString == nil { return }
第二行和第三行不会产生相同的结果吗?
我理解if let
使代码更简单,而不是检查nil
并解开它,但guard
的目的是什么?根据我的研究,我只能找到人们说它可以减少嵌套if
,反转if
可以做同样的事情。
编辑:我问的是反转
if
不if let
。请阅读 标记之前的问题。
答案 0 :(得分:6)
guard
有两个重要的事项,即倒置if
(或if let
)没有:
guard
必须有else
条款,必须有return
语句或其他方式离开警卫的父范围(例如throw
或break
)。 guard
声明并由guard
分配的变量可在guard
的父作用域中使用。 if let
的重点在于它允许你避免繁琐的构造,如guard optString != nil else { return }
body继续到方法的结尾,因为代码必须只在可选的一些解包成功时执行。基本上,它是一种更清晰的方式来实现提前退出。
因此,要回答您的直接问题,是if optString == nil { return }
相当于guard
,但这不是guard
引入的内容:
与使用
if
语句进行相同检查相比,对需求使用else
语句可提高代码的可读性。它允许您编写通常执行的代码而不将其包装在{{1}}块中,并且它允许您保留处理需求旁边违反要求的代码。
答案 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种可能性:
您的第2行和第3行具有相同的结果,因为它会通过scope
命令停止return
。