首页 文章

你可以异步调度非转义闭包函数吗?

提问于
浏览
1

我简要理解转义和非转义闭包之间的区别:

  • 函数返回后调用转义闭包 . 从我所知道的,这类似于node.js中回调的处理方式 - 函数立即返回,它们异步执行,并且当闭包/完成块/回调是函数时,处理函数内部长时间运行的结果调用 .

  • 非转义闭包似乎是同步执行的,其中函数本身在长时间运行操作完成之前不会返回 .

(我说得对吗?)

读取更改日志和从Swift 2的 @noescape 移动到Swift 3的 @escaping (在SE-0103中)的理由,看起来您可以异步调度非转义闭包 .

这是真的?可能?

您可以异步调度非转义闭包函数吗?如果是这样,怎么样?

奖励点 - 我真的想了解为什么存在转义和非转义闭包的原因:

  • 是否存在异步调度非转义闭包代替转义闭包的实际用例?

  • 在设计方案中,它表明函数式编程受益于非转义(读取:同步?)是默认值 . 这是真的?为什么?

  • 非转义闭包与node.js中的承诺之间是否有任何相似之处?

  • 如果我对所有这些都错了,为什么不把它叫做 @async 而不是 @escaping

1 回答

  • 4

    我无法想象异步调度函数如何可以非转义 . 提案中是否有特定声明表明?

    关于您的其他问题:

    是否存在异步调度非转义闭包代替转义闭包的实际用例?

    这应该是不可能的,所以不会有用例:)

    在设计方案中,它表明函数式编程受益于非转义(读取:同步?)是默认值 . 这是真的?为什么?

    该提案表示功能编程将受益于较少的样板(即必须将所有参数标记为 @noescape ) . 由于函数式编程通常需要许多主要是非转义的函数 - 作为参数,因此这个新的默认值允许函数式算法具有更清晰,更简洁的签名,并减少在任何地方键入 @noescape 样板 .

    非转义闭包和node.js中的承诺之间是否有任何相似之处?

    不,promises是异步的,可以使用转义闭包而不是非转义闭包在Swift中实现 .

    如果我对所有这些都错了,为什么不把它称为@async而不是@escaping?

    因为它们的概念并不完全相同 . 转义闭包可以同步执行,但可以保存以便以后执行 . @async 描述了执行的性质,但 @escaping 仅表示闭包将在传递给它的函数返回后执行 . 当一个转义闭包执行时,它可能同时或异步地执行 .

相关问题