我对代码块或“作用域”的定义感到困惑。苹果公司的守卫文档说了这一点:守卫声明的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:
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种可供您选择:
guard
throw
continue
while
for
repeat-while
if
此外,您可以通过调用一个函数退出作用域的回报Never,如fatalError。
Never
fatalError