一尘不染

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

swift

我对代码块或“作用域”的定义感到困惑。苹果公司的守卫文档说了这一点:守卫声明的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语句中存在的“空间”的正确术语是什么?


阅读 244

收藏
2020-07-07

共1个答案

一尘不染

完全可以按照您的设想进行操作,而恰恰不是该特定代码所做的。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种可供您选择:

  • return并且throw都退出功能/方法
  • continue可以在循环(while/ for/ repeat-while)中使用
  • break可以在循环(while/ for/ repeat-while)中使用以退出立即作用域。指定要中断的标签将允许您一次退出多个范围(例如中断嵌套循环结构)。使用标签时,break也可以在if范围内使用。

此外,您可以通过调用一个函数退出作用域的回报Never,如fatalError

2020-07-07