当前位置: 首页 > 面试题库 >

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

柳逸春
2023-03-14
问题内容

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


问题答案:

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



 类似资料:
  • 我有以下html: 我试图获得如下范围: 但我收到:。 我是angularJS初学者,我只是不明白为什么这不起作用。 更新:这也不起作用: 更新2:我试图在控制台中打印出作用域的所有代码:

  • 问题内容: 我试图了解在多个JavaConfig上下文中放置注释的正确位置在哪里? 考虑以下情形:我在JPAConfig.java和AppConfig.java中具有服务bean集的JPA配置。然后,在RootConfig.java中编写整个应用程序配置。 我在JPAConfig.java中定义事务管理器,并启用对JPA存储库的扫描- 当这些暴露事务行为时,我将其放到JPAConfig上,并且它可

  • 我刚开始编码。我想对同一个变量使用两次switch语句,我被告知要这样做,变量必须是'inscope'。 作为一个初学者,我不知道那是什么意思。那么在范围内意味着什么呢?而且,如果一个变量不在作用域中,我如何使它在作用域中?

  • 我是一个角度开发人员和新的反应,这是简单的反应组件,但不工作 错误:在JSX作用域中使用JSX React/React时,“React”必须在作用域中

  • 问题内容: 什么是词汇作用域简介? 问题答案: 我通过示例了解它们。:) 首先,采用类似C的语法的 词汇作用域 (也称为 静态作用域 ): 每个内部级别都可以访问其外部级别。Lisp的第一个实现使用另一种称为动态范围的方式,再次使用类似C的语法: 在这里既可以访问的或,或在调用任何函数与在其声明。 将打印5 将打印10。 第一个称为静态,因为它可以在编译时推导,第二个称为动态,因为外部范围是动态的

  • 问题内容: 我在应用程序中发现的内存泄漏之一是私有静态字段,该字段跟踪每个实例化。我们创建,使用并随后忘记了对话框,并且期望它们会消失并被垃圾回收。此私有字段将它们无限期地保持在范围内,直到对它们调用该方法为止。而且根据定义,当它们超出范围时,我们不能这样做。 我不明白为什么要这样设计。在完成对象处理后必须显式地让系统知道,这似乎与垃圾回收的精神背道而驰。显然,我已经完成了,因为它超出了范围。 我