2017-08-17 100 views
0

逃避关闭我已经阅读了大量的材料对堆栈溢出,我实在不明白这一个:在迅速

我一直在这行代码来自网上的几个小时,我只是不知道为什么会被传递给函数在闭包逃跑,这里是代码:

func composeFunction(functionA: @escaping (Int) -> String, functionB: @escaping (String) -> String) -> ((Int) -> String) { 

    return { 

     number in 

     functionB(functionA(number)) 
    } 
} 

从苹果公司的文件,闭包逃脱时: 1)在后台线程 2)的封闭运行的异步操作与其范围之外的属性交互(使用self

但我没有看到这些正在发生,很多帮助将不胜感激!

谢谢!

回答

1
{ 
    number in 
    functionB(functionA(number)) 
} 

是闭包。返回它会导致functionBfunctionA转义,因为在什么时候该闭包将被调用或释放,它变得未知。

这与return functionB(functionA(number))不同,它会立即调用这两个函数,并导致它们永远不会跳过composeFunction上下文。

+0

谢谢,所以纠正我,如果我错了,为什么'functionA'和'functionB'转义是因为'composeFunction'不知道什么时候返回闭包被调用? –

+0

@BrendonCheung没有太多,它不知道什么时候被调用,但它不知道它何时被释放。对于所有它知道,'composeFunction'调用的结果可以无限期地存储,因此无限期地保持逸出对函数A/B的引用 – Alexander

+0

只要我调用'composeFunction(functionA:randomFuncA ,functionB:randonFuncB)'? –

2

你的func composeFunction返回一个((Int) -> (String))这就是封闭。当然,这意味着函数A和函数B将被转义,因为我们不知道何时何地该闭包将被调用。此外,这是因为它需要知道它是否应该保持对传入/被操纵的对象的引用。例如,如果您的所有关闭参数都有(() -> Void),而您也返回了(() -> Void),那么它不需要转义。