我简要理解转义和非转义闭包之间的区别:
-
函数返回后调用转义闭包 . 从我所知道的,这类似于node.js中回调的处理方式 - 函数立即返回,它们异步执行,并且当闭包/完成块/回调是函数时,处理函数内部长时间运行的结果调用 .
-
非转义闭包似乎是同步执行的,其中函数本身在长时间运行操作完成之前不会返回 .
(我说得对吗?)
读取更改日志和从Swift 2的 @noescape
移动到Swift 3的 @escaping
(在SE-0103中)的理由,看起来您可以异步调度非转义闭包 .
这是真的?可能?
您可以异步调度非转义闭包函数吗?如果是这样,怎么样?
奖励点 - 我真的想了解为什么存在转义和非转义闭包的原因:
-
是否存在异步调度非转义闭包代替转义闭包的实际用例?
-
在设计方案中,它表明函数式编程受益于非转义(读取:同步?)是默认值 . 这是真的?为什么?
-
非转义闭包与node.js中的承诺之间是否有任何相似之处?
-
如果我对所有这些都错了,为什么不把它叫做
@async
而不是@escaping
?
1 回答
我无法想象异步调度函数如何可以非转义 . 提案中是否有特定声明表明?
关于您的其他问题:
这应该是不可能的,所以不会有用例:)
该提案表示功能编程将受益于较少的样板(即必须将所有参数标记为
@noescape
) . 由于函数式编程通常需要许多主要是非转义的函数 - 作为参数,因此这个新的默认值允许函数式算法具有更清晰,更简洁的签名,并减少在任何地方键入@noescape
样板 .不,promises是异步的,可以使用转义闭包而不是非转义闭包在Swift中实现 .
因为它们的概念并不完全相同 . 转义闭包可以同步执行,但可以保存以便以后执行 .
@async
描述了执行的性质,但@escaping
仅表示闭包将在传递给它的函数返回后执行 . 当一个转义闭包执行时,它可能同时或异步地执行 .