如果Swift'guard'语句必须退出范围,范围的定义是什么?

时间:2016-08-15 16:03:51

标签: swift scope

我对代码块或“范围”的定义感到困惑。苹果公司的卫兵文件说:保护声明的其他部分......

  

“必须转移控制以退出出现保护声明的代码块。”

其他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'的正确术语是什么?

2 个答案:

答案 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种可用:

  • returnthrow都退出函数/方法
  • continue可在循环中使用(while / for / repeat-while
  • break可用于循环(while / for / repeat-while)以退出直接范围。指定要中断的标签将允许您一次退出多个范围(例如,打破嵌套的循环结构)。使用标签时,break范围内也可以使用if

此外,您可以通过调用返回Never的函数来退出范围,例如fatalError

答案 1 :(得分:-1)

你误解了文档所说的内容。守卫声明本身并不退出任何范围。你必须在退出包含guard语句的范围的guard语句中写一些语句。

return将退出范围。在循环中,中断或继续将退出范围。在许多情况下,goto将退出停止。没有特定的语句来退出if语句的范围,因此您需要一个goto语句或者退出循环或包含guard语句的函数。