1
230
的“其他”情况
通常,如果
|
2
150
守卫可以提高 清晰当你使用守卫时,你有很多 较高的 对警卫的期望 达到目的 有一点很重要,如果它不成功,那么您只需要退出范围 早期的 。就像您要查看文件/图像是否存在,数组是否为空。
如果您使用If let编写上述代码,它会向阅读开发人员传达一种五五开的感觉 清晰 这意味着我希望它能在95%的时间内工作……如果它失败了,我不知道为什么会失败;这是非常不可能的……但只需使用这个默认图像,或者只需使用一条有意义的消息来描述错误所在!
由于以上建议和干净的代码 可能的 您需要将断言添加到 失败 guard语句,它只是提高了可读性,并向其他开发人员表明了您的期望。
(您不会使用断言/前提条件
使用防护装置还可以通过以下方式提高清晰度 避开金字塔 厄运。看见 Nitin's answer . Guard将处理违规需求的代码保存在需求旁边
为了清楚,
例子:
在上文中,要求图像不存在于缓存中。如果图像存在,则违反了我们的要求。我们很早就回来了。正如您所看到的,我们还处理了违反的代码路径,就在它的需求旁边,即结构不是:
这个 Swift Docs on Control Flow 解释背后的想法:
Guard通过创建 新 当前范围中的变量有一个重要的区别,我相信没有人能很好地解释。
二者都
具有
具有
有关更多信息
防护要求 作用域退出(Rob Napier的回答中也提到):
你必须有
对于
|
3
54
何时使用
说你有
您可以使用
或者像这样使用
这些示例在功能上完全相同。
哪里
而不是嵌套一堆
|
4
39
我将尝试用一些(未优化的)代码解释guard语句的有用性。 您有一个UI,用于验证用户名、姓氏、电子邮件、电话和密码的用户注册文本字段。 如果任何textField不包含有效文本,则应将该字段设置为firstResponder。 以下是未优化的代码:
您可以在上面看到,所有字符串(firstNameString、lastNameString等)只能在if语句的范围内访问。因此,它创建了这个“末日金字塔”,并存在许多问题,包括可读性和移动东西的方便性(如果字段的顺序被更改,则必须重写大部分代码)
使用guard语句(在下面的代码中),您可以看到这些字符串在
如果字段的顺序发生变化,只需向上或向下移动相应的代码行,就可以开始了。 这是一个非常简单的解释和用例。希望这有帮助! |
5
21
基本区别 警卫室
如果让
注意:这两个都用于展开可选变量。 |
6
7
后卫让vs如果让
|
7
6
我看到的最清楚的解释是 Github Swift Style Guide :
|
8
6
保护声明的格式如下:
|
9
2
我是从斯威夫特和鲍勃那里学到的。。 典型的Else If
Else If的问题
保护声明 只有当条件为false时,保护块才会运行,并且它将通过返回退出函数。如果条件为真,Swift将忽略保护块。它提供了早期退出和更少的括号+
使用Else If展开选项 guard语句不仅适用于用else-if语句替换典型的条件块,还适用于通过最小化括号的数量来展开选项。为了进行比较,让我们首先开始如何使用else-if展开多个选项。 首先,让我们创建三个将展开的选项。
最糟糕的噩梦
上面的代码当然有效,但违反了DRY原则。这太残忍了。让我们把它分解+ 稍微好一点 下面的代码比上面的代码更可读+
用防护装置展开 其他if语句可以用guard替换+
使用Else If展开多个选项 到目前为止,您一直在逐一展开选项。Swift允许我们一次打开多个期权。如果其中一个包含nil,它将执行else块。
使用Guard展开多个选项 当然,我们应该在其他情况下保持警惕+
|
10
0
swift中guard和if语句的主要区别是:
|
agienka · 通过抛出异常进行Java流控制 7 年前 |
lightyrs · 如何包装异步包函数? 7 年前 |
Ashbay · 在NodeJS中发送HTTP响应之前等待事件发生? 8 年前 |
Jonathan Mee · 在条件之外使用短路运算符合法吗? 9 年前 |
Lance Chao · GDB-显示执行的最后n行 9 年前 |
lmiguelvargasf · 斯威夫特:后卫让vs如果让 9 年前 |
Sam · 在上一事件结束后处理下一事件 9 年前 |
alga tronic · Python 2.7控制流 9 年前 |
dongle · 基于Python CSV行值的流控制 12 年前 |