我对转义和非转义闭包之间的区别的简要了解:
函数返回后,转义的闭包被调用。据我所知,这类似于在node.js中处理回调的方式-函数立即返回,它们异步执行,并且当闭包/完成块/时处理函数内部长时间运行的结果回调被调用。
非转义的闭包似乎是同步执行的,在该函数本身直到长时间运行的操作完成后才返回。
(我说对了吗?)
阅读更改日志和从Swift 2迁移@noescape
到Swift 3的理由@escaping
(在SE-0103中),您似乎可以异步分派非转义的闭包。
这是真的?可能?
您可以异步调度一个非转义的闭包函数吗?如果是这样,怎么办?
优点-我真的很想了解为什么同时存在转义和非转义的闭包:
是否存在实际的用例,用于异步调度非转义的闭包而不是转义的闭包?
在设计建议中,它建议函数编程受益于默认情况下的非转义(读取:同步?)。这是真的?为什么?
非转义的闭包和node.js中的promise是否有任何相似之处?
如果我在所有这些方面都不对,为什么不直接调用它@async
而不是@escaping
?
Daniel Hall.. 5
我无法想到异步调度的函数如何不转义。提案中是否有具体说明建议?
关于您的其他问题:
是否存在实际的用例,用于异步调度非转义的闭包而不是转义的闭包?
这不可能,因此不会有用例:)
在设计建议中,它建议函数编程受益于默认情况下的非转义(读取:同步?)。这是真的?为什么?
该提案表示,减少重复的工作量(即必须将所有参数都标记为@noescape
)将使函数式编程受益。由于函数式编程通常需要包含许多功能参数,而这些参数主要是不可转义的,因此此新的默认设置允许函数式算法具有更清晰,更整洁的签名,并减少了在@noescape
各处的样板键入。
非转义的闭包和node.js中的promise是否有相似之处?
不,promise是异步的,将在Swift中使用转义的闭包而不是非转义的闭包实现。
如果我对所有这些都不对,为什么不直接将其命名为@async而不是@escaping呢?
因为它们不是完全相同的概念。逃避的闭包可以同步执行,但可以保存起来以备以后使用。 @async
描述了执行的性质,但是@escaping
仅意味着闭包将在传递给函数的函数返回后执行。当转义的闭包确实执行时,它可能在那时同步或异步执行。
我无法想到异步调度的函数如何不转义。提案中是否有具体说明建议?
关于您的其他问题:
是否存在实际的用例,用于异步调度非转义的闭包而不是转义的闭包?
这不可能,因此不会有用例:)
在设计建议中,它建议函数编程受益于默认情况下的非转义(读取:同步?)。这是真的?为什么?
该提案表示,减少重复的工作量(即必须将所有参数都标记为@noescape
)将使函数式编程受益。由于函数式编程通常需要包含许多功能参数,而这些参数主要是不可转义的,因此此新的默认设置允许函数式算法具有更清晰,更整洁的签名,并减少了在@noescape
各处的样板键入。
非转义的闭包和node.js中的promise是否有相似之处?
不,promise是异步的,将在Swift中使用转义的闭包而不是非转义的闭包实现。
如果我对所有这些都不对,为什么不直接将其命名为@async而不是@escaping呢?
因为它们不是完全相同的概念。逃避的闭包可以同步执行,但可以保存起来以备以后使用。 @async
描述了执行的性质,但是@escaping
仅意味着闭包将在传递给函数的函数返回后执行。当转义的闭包确实执行时,它可能在那时同步或异步执行。