我对代码块或“范围”的定义感到困惑.苹果公司的卫士文件说:保护声明的其他部分……
“must transfer control to exit the code block in which the guard statement appear.”
其他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子句中.
完全有可能做你想象的事情,它恰好不是那个特定的代码所做的. return始终退出方法,而不是本地范围.要做你想做的事,你可以使用标签,并打破:
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()
警卫强制您使用控制转移声明退出范围.有4个可供选择:
> return并抛出两个退出函数/方法
> continue可以在循环中使用(while / for / repeat-while)
> break可用于循环(while / for / repeat-while)以退出直接范围.指定要中断的标签将允许您一次退出多个范围(例如,打破嵌套循环结构).使用标签时,break也可用于if范围.