如何将闭包附加到另一个闭包?

然后

所以我在这里有了我的第一个关闭:

var instructions: (() -> Void) = {
    print("First")
}

instructions() /// prints "First"

现在,我有另一个关闭:

let additionalInstructions: (() -> Void) = {
    print("Second")
}

additionalInstructions() /// prints "Second"

我想“附加” additionalInstructions到...的结尾instructions...这可能吗?我尝试制作一个包含它们的新闭包,如下所示:

let finalInstructions: (() -> Void) = {
    instructions()
    additionalInstructions()
}

finalInstructions()

此打印

第一

第二

但是,当我更换instructions使用finalInstructions,我得到一个EXC_BAD_ACCESS

instructions = finalInstructions
instructions() /// error here

EXC_BAD_ACCESS error

我认为这是因为闭包是引用类型,并且在instructions包含自身时会发生某种循环有办法避免错误吗?finalInstructions容器一样制作一个新的闭合,也似乎很笨拙。

亚力山大

这是我没想到的一些有趣的语义,但是您看到的是无限递归,该递归由于堆栈溢出而崩溃。您可以通过在项目中运行此代码来确认这一点,调试器将在该项目中捕获错误。您将看到数千个相同闭包的堆栈框架被调用。

instructions闭包中的引用似乎正在捕获其新的自引用值,而不是先前的值。

您使用像这样的新变量的finalInstructions方法要好得多。不仅因为它避免了这个问题,而且还因为它更具可读性。

这是一个更简单,更简单的问题演示:

var closure = { print("initial definition") }

closure() // prints "initial definition"

closure = {
    print("second definition")
    closure()
}

closure() // prints "second definition" repeatedly, until the stack overflows

仅供参考,我在Swift论坛上对此进行了询问:https : //forums.swift.org/t/mutable-closures-can-capture-themselves/43228

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将Rust与wasm-bindgen一起使用,以创建一个带有状态的另一个闭包的闭包?

来自分类Dev

groovy ..将闭包作为参数传递给另一个闭包

来自分类Dev

根据另一个闭包来定义一个闭包

来自分类Dev

build.gradle如何应用另一个文件的闭包

来自分类Dev

Rust将闭包附加到向量

来自分类Dev

如何拥有一个接受另一个变量的闭包调用方法的结构?

来自分类Dev

如何创建一个使用闭包对象作为参数调用(或组合)另一个Expression的Expression?

来自分类Dev

extjs-如何从另一个控制器或闭包中正确调用控制器方法

来自分类Dev

RunST防止在闭包中访问另一个有状态线程的引用

来自分类Dev

尝试从Gradle测试任务访问另一个闭包的属性

来自分类Dev

在另一个闭包内的 setTimeout 内无法识别数据

来自分类Dev

当另一个调用 lambda 使用默认捕获时,可以破坏 lambda 的闭包?

来自分类Dev

Jenkins/Groovy:如何将命名参数和闭包传递给同一个方法?

来自分类Dev

如何将变量移出闭包?

来自分类Dev

如何将一个div附加到另一个div

来自分类Dev

如何将一个 std::queue 的内容附加到另一个

来自分类Dev

如何创建一个使用闭包对象作为参数调用(或与另一个表达式组合)的Expression?

来自分类Dev

C++ Lambda/闭包混淆 - 如何返回一个值,而不是一个闭包

来自分类Dev

如何将Java类(从一个包中)继承到另一个类(在另一个包中)

来自分类Dev

在闭包中附加到数组

来自分类Dev

为什么允许通过原型继承访问另一个闭包范围内的私有变量?

来自分类Dev

如何将另一个模块中的类附加到jar中?

来自分类Dev

如何将div附加到变量内的另一个div中?

来自分类Dev

如何将另一个目录链接附加到HTML中的<a>

来自分类Dev

如何将div的html标签附加到另一个div?

来自分类Dev

如何将变量值附加到另一个变量

来自分类Dev

如何将div附加到变量内的另一个div中?

来自分类Dev

如何将变量附加到另一个变量名称?

来自分类Dev

如何将另一个目录附加到别名`cd`命令?

Related 相关文章

  1. 1

    如何将Rust与wasm-bindgen一起使用,以创建一个带有状态的另一个闭包的闭包?

  2. 2

    groovy ..将闭包作为参数传递给另一个闭包

  3. 3

    根据另一个闭包来定义一个闭包

  4. 4

    build.gradle如何应用另一个文件的闭包

  5. 5

    Rust将闭包附加到向量

  6. 6

    如何拥有一个接受另一个变量的闭包调用方法的结构?

  7. 7

    如何创建一个使用闭包对象作为参数调用(或组合)另一个Expression的Expression?

  8. 8

    extjs-如何从另一个控制器或闭包中正确调用控制器方法

  9. 9

    RunST防止在闭包中访问另一个有状态线程的引用

  10. 10

    尝试从Gradle测试任务访问另一个闭包的属性

  11. 11

    在另一个闭包内的 setTimeout 内无法识别数据

  12. 12

    当另一个调用 lambda 使用默认捕获时,可以破坏 lambda 的闭包?

  13. 13

    Jenkins/Groovy:如何将命名参数和闭包传递给同一个方法?

  14. 14

    如何将变量移出闭包?

  15. 15

    如何将一个div附加到另一个div

  16. 16

    如何将一个 std::queue 的内容附加到另一个

  17. 17

    如何创建一个使用闭包对象作为参数调用(或与另一个表达式组合)的Expression?

  18. 18

    C++ Lambda/闭包混淆 - 如何返回一个值,而不是一个闭包

  19. 19

    如何将Java类(从一个包中)继承到另一个类(在另一个包中)

  20. 20

    在闭包中附加到数组

  21. 21

    为什么允许通过原型继承访问另一个闭包范围内的私有变量?

  22. 22

    如何将另一个模块中的类附加到jar中?

  23. 23

    如何将div附加到变量内的另一个div中?

  24. 24

    如何将另一个目录链接附加到HTML中的<a>

  25. 25

    如何将div的html标签附加到另一个div?

  26. 26

    如何将变量值附加到另一个变量

  27. 27

    如何将div附加到变量内的另一个div中?

  28. 28

    如何将变量附加到另一个变量名称?

  29. 29

    如何将另一个目录附加到别名`cd`命令?

热门标签

归档