【发布时间】:2016-12-21 20:51:22
【问题描述】:
我对代码块或“范围”的定义感到困惑。苹果守卫文档这样说:守卫语句的 else 块......
“必须转移控制权才能退出出现保护语句的代码块。”
其他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()
根据我目前对'scope'的理解,代码
if y == 2 {....}
创建一个新范围,即在 { } 之间。考虑到这个假设,guard 只会逃避这个范围。但事实并非如此。在这种情况下,Guard 会从它所在的函数中逃脱,而不管它是否被埋在 if 子句中。
我是否完全误解了“范围”的含义?范围是指方法中包含的代码吗?如果是这样,if 语句中存在的“空间”的正确术语是什么?
【问题讨论】:
-
要求else子句离开当前作用域。
return通过离开整个函数来满足要求,这肯定会离开当前范围。不必在 else 子句中使用return。其他的也可以,比如continue。