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

在Swift中转义闭包

程和畅
2023-03-14
问题内容

我是Swift的新手,当我遇到转义的闭包时,我正在阅读手册。我根本没有得到手册的描述。有人可以简单地向我解释一下Swift中的转义闭包是什么。


问题答案:

考虑此类:

class A {
    var closure: (() -> Void)?
    func someMethod(closure: @escaping () -> Void) {
        self.closure = closure
    }
}

someMethod 将传入的闭包分配给类中的属性。

现在是另一个类:

class B {
    var number = 0
    var a: A = A()
    func anotherMethod() {
        a.someMethod { self.number = 10 }
    }
}

如果我调用anotherMethod,则闭包{ self.number = 10 }将存储在的实例中A。由于self是在闭包中捕获的,因此的实例A还将对其具有很强的引用性。

基本上,这是逃脱的闭包的例子!

您可能想知道,“什么?那么封闭从何处逃脱到何处?”

闭包从方法的范围转义到类的范围。而且可以稍后调用,甚至可以在另一个线程上!如果处理不当,可能会导致问题。

默认情况下,Swift不允许闭包转义。您必须添加@escaping闭包类型,以告知编译器“请允许此闭包转义”。如果我们删除@escaping

class A {
    var closure: (() -> Void)?
    func someMethod(closure: () -> Void) {
    }
}

并尝试编写self.closure = closure,它不会编译!



 类似资料:
  • 问题内容: 编译器错误Closure use of non-escaping parameter ‘completion’ may allow it to escape,这是有道理的,因为它将在函数 返回之后被调用。 但是,如果我将闭包设为可选,则不会出现编译器错误,那是为什么呢? 函数返回后仍可以调用闭包。 问题答案: Clarification: 为了理解这种情况,实现以下代码将很有用: 乍一

  • 我有一个,其形式为: 但是我得到错误:< code >将非转义参数“someOtherClosure”传递给需要@escaping闭包的函数。 这两个闭包实际上都是不可转义的(默认情况下),并且显式地将添加到会产生一个警告,表明这是Swift 3.1中的默认值。 知道我为什么会得到这个错误吗?

  • 问题内容: 鉴于: 有什么方法可以使参数(和)的类型也保持不变? 更改类型会出现以下错误: @escaping属性仅适用于函数类型 删除该属性后,代码将编译并运行,但由于闭包使函数的作用范围变大,因此似乎并不正确。 问题答案: 有一个SR-2552报告无法识别功能类型别名。这就是错误的原因。您可以通过扩展函数签名中的函数类型来解决: 编辑1 : 我实际上是在xcode 8 beta版本下,但尚未解

  • 鉴于: 有什么方法可以使类型的参数(和)并且还保留? 更改类型会产生以下错误: @escaping属性仅适用于函数类型 删除属性,代码将编译并运行,但似乎不正确,因为闭包正在转义函数的范围。

  • 我知道Swift 3中的更改,其中@nonevinging是闭包的默认行为。 我已经成功地更改了有关更改的大部分代码,但我的代码中有一部分无法摆脱闭包使用非转义参数可能允许它转义编译错误。 我尝试过在updateHandler参数和UpdatedInProgressHandler typealias中添加@逃逸,但这似乎还不够。 有人能帮我找出问题的原因吗? 定义typealiases和函数的代码

  • 问题内容: 这是我的自定义Segue的代码 我以为这可行,但实际上只有在执行segue后,视图才会改变。我应该怎么做才能使视图在中间出现“翻转”时发生变化? 提前致谢。 问题答案: 从iOS 7开始,我们通常不使用自定义序列为过渡设置动画。我们要么使用标准的模态演示,指定一个(即,可以为模态过渡选择的一些动画的固定列表),要么实现自定义动画过渡。这两个描述如下: 如果仅显示另一个视图控制器的视图,