我对代码块或“作用域”的定义感到困惑。苹果公司的守卫文档说了这一点:守卫声明的else块…
“必须转移控制权以退出其中出现保护声明的代码块。”
其他在线消息来源说,警卫声明必须退出其存在的“范围”。
因此,请看下面的示例代码:
func testGuardControlFlow () {
let x = 2
let y = 2
func embededFunc () {
if y == 2 {
guard x == 1 else {
print("oops, number is not 1")
return
}
print ("from in embededFunc")
}
print ("I still want this to print even if x != 1")
}
embededFunc()
print("Great, return still allows this to be printed.")
}
testGuardControlFlow()
根据我目前对“范围”的理解,代码
if y == 2 {....}
创建一个新范围,即{}之间。鉴于此假设,后卫只会逃避这一范围。但事实并非如此。在这种情况下,无论是否将其埋在if子句中,guard都将从其所放置的函数中逃脱。
我是否完全误解了“范围”的含义?范围是否表示方法中包含的代码?如果是这样,if语句中存在的“空间”的正确术语是什么?
完全可以按照您的设想进行操作,而恰恰不是该特定代码所做的。return
总是退出方法,而不是本地范围。要执行您想要的操作,可以使用标签,然后break
:
func testGuardControlFlow () {
let x = 2
let y = 2
func embededFunc () {
breakLabel:
if y == 2 {
guard x == 1 else {
print("oops, number is not 1")
break breakLabel
}
print ("from in embededFunc")
}
print ("I still want this to print even if x != 1")
}
embededFunc()
print("Great, return still allows this to be printed.")
}
testGuardControlFlow()
添加到vadian的答案:
guard
强制您使用控制转移语句退出作用域。有4种可供您选择:
return
并且throw
都退出功能/方法continue
可以在循环(while
/ for
/ repeat-while
)中使用break
可以在循环(while
/ for
/ repeat-while
)中使用以退出立即作用域。指定要中断的标签将允许您一次退出多个范围(例如中断嵌套循环结构)。使用标签时,break
也可以在if
范围内使用。此外,您可以通过调用一个函数退出作用域的回报Never
,如fatalError
。
我有以下html: 我试图获得如下范围: 但我收到:。 我是angularJS初学者,我只是不明白为什么这不起作用。 更新:这也不起作用: 更新2:我试图在控制台中打印出作用域的所有代码:
问题内容: 我试图了解在多个JavaConfig上下文中放置注释的正确位置在哪里? 考虑以下情形:我在JPAConfig.java和AppConfig.java中具有服务bean集的JPA配置。然后,在RootConfig.java中编写整个应用程序配置。 我在JPAConfig.java中定义事务管理器,并启用对JPA存储库的扫描- 当这些暴露事务行为时,我将其放到JPAConfig上,并且它可
我刚开始编码。我想对同一个变量使用两次switch语句,我被告知要这样做,变量必须是'inscope'。 作为一个初学者,我不知道那是什么意思。那么在范围内意味着什么呢?而且,如果一个变量不在作用域中,我如何使它在作用域中?
我是一个角度开发人员和新的反应,这是简单的反应组件,但不工作 错误:在JSX作用域中使用JSX React/React时,“React”必须在作用域中
问题内容: 什么是词汇作用域简介? 问题答案: 我通过示例了解它们。:) 首先,采用类似C的语法的 词汇作用域 (也称为 静态作用域 ): 每个内部级别都可以访问其外部级别。Lisp的第一个实现使用另一种称为动态范围的方式,再次使用类似C的语法: 在这里既可以访问的或,或在调用任何函数与在其声明。 将打印5 将打印10。 第一个称为静态,因为它可以在编译时推导,第二个称为动态,因为外部范围是动态的
问题内容: 我在应用程序中发现的内存泄漏之一是私有静态字段,该字段跟踪每个实例化。我们创建,使用并随后忘记了对话框,并且期望它们会消失并被垃圾回收。此私有字段将它们无限期地保持在范围内,直到对它们调用该方法为止。而且根据定义,当它们超出范围时,我们不能这样做。 我不明白为什么要这样设计。在完成对象处理后必须显式地让系统知道,这似乎与垃圾回收的精神背道而驰。显然,我已经完成了,因为它超出了范围。 我