2017-08-17 99 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),那麼它不需要轉義。