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

Swift可选的转义闭包参数

漆雕恺
2023-03-14
问题内容

鉴于:

typealias Action = () -> ()

var action: Action = { }

func doStuff(stuff: String, completion: @escaping Action) {
    print(stuff)
    action = completion
    completion()
}

func doStuffAgain() {
    print("again")
    action()
}

doStuff(stuff: "do stuff") { 
    print("swift 3!")
}

doStuffAgain()

有什么方法可以使completion参数(和action)的类型Action?也保持不变@escaping

更改类型会出现以下错误:

@escaping属性仅适用于函数类型

删除该@escaping属性后,代码将编译并运行,但由于completion闭包使函数的作用范围变大,因此似乎并不正确。


问题答案:

有一个SR-2552报告@escaping无法识别功能类型别名。这就是错误的原因@escaping attribute only applies to function types。您可以通过扩展函数签名中的函数类型来解决:

typealias Action = () -> ()

var action: Action? = { }

func doStuff(stuff: String, completion: (@escaping ()->())?) {
    print(stuff)
    action = completion
    completion?()
}

func doStuffAgain() {
    print("again")
    action?()
}

doStuff(stuff: "do stuff") {
    print("swift 3!")
}

doStuffAgain()

编辑1

我实际上是在xcode 8 beta版本下,但尚未解决bug
SR-2552。修复了该错误,并引入了一个仍在打开的新错误(您面临的错误)。参见SR-2444。

解决方法 @迈克尔Ilseman 指出作为临时解决方案是去除@escaping从可选功能类型的属性, 其保持功能逸出

func doStuff(stuff: String, completion: Action?) {...}

编辑2 ::

该SR-2444已经被关闭,说明明确,在参数位置关闭
逃逸,需要他们被打上@escaping让他们逃脱,但可选参数
隐含逃避,因为((Int)->())?是同义词Optional<(Int)->()>,可选的闭包逃跑。



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

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

  • 问题内容: 我是Swift的新手,当我遇到转义的闭包时,我正在阅读手册。我根本没有得到手册的描述。有人可以简单地向我解释一下Swift中的转义闭包是什么。 问题答案: 考虑此类: 将传入的闭包分配给类中的属性。 现在是另一个类: 如果我调用,则闭包将存储在的实例中。由于是在闭包中捕获的,因此的实例还将对其具有很强的引用性。 基本上,这是逃脱的闭包的例子! 您可能想知道,“什么?那么封闭从何处逃脱到

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

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

  • 我有一个协议: 通过一个示例实现: 上面的代码在 Swift3 (Xcode8-beta5) 中编译和工作,但不再与 beta 6 一起使用。你能给我指出根本原因吗?