我对代码块或“范围”的定义感到困惑。苹果公司的卫兵文件说:保护声明的其他部分......
“必须转移控制以退出出现保护声明的代码块。”
其他online sources说护卫声明必须退出它所在的“范围”。
请参考下面的示例代码:
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 {....}
创建一个新范围,即{}之间。并且考虑到这个假设,后卫只会逃避这个范围。但事实并非如此。在这种情况下,Guard不会放置它所放置的函数,而不管它是否隐藏在if子句中。
我是否完全误解了“范围”的含义?范围是指方法中包含的代码吗?如果是这样,if语句中存在的'space'的正确术语是什么?
答案 0 :(得分:24)
完全有可能做你想象的事情,它恰好不是那个特定的代码所做的。 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's answer:
guard
强制您使用控制转移语句退出范围。有4种可用:
return
和throw
都退出函数/方法continue
可在循环中使用(while
/ for
/ repeat-while
)break
可用于循环(while
/ for
/ repeat-while
)以退出直接范围。指定要中断的标签将允许您一次退出多个范围(例如,打破嵌套的循环结构)。使用标签时,break
范围内也可以使用if
。此外,您可以通过调用返回Never
的函数来退出范围,例如fatalError
。
答案 1 :(得分:-1)
你误解了文档所说的内容。守卫声明本身并不退出任何范围。你必须在退出包含guard语句的范围的guard语句中写一些语句。
return将退出范围。在循环中,中断或继续将退出范围。在许多情况下,goto将退出停止。没有特定的语句来退出if语句的范围,因此您需要一个goto语句或者退出循环或包含guard语句的函数。