クロージャがスコープから抜けても存在し続けるときに @escaping が必要になります。
具体的には以下のような場合です。
- クロージャがスコープ外で強参照されるとき
- クロージャを非同期的に実行するとき
よってクロージャをすぐに実行し、どこからも強参照されない場合は @escaping は必要ありません。
import UIKit
class ViewController: UIViewController {
var myCallback: () -> () = {() in }
override func viewDidLoad() {
super.viewDidLoad()
self.first(callback: { () -> Void in
// second(callback2:)内で呼び出される
print("5")
})
print("3")
// second(callback2:)で渡したCallback用Clousureが実行される
myCallback()
}
// 1. viewDidLoadから実行される
func first(callback: @escaping () -> ()) {
print("1")
self.second(callback2: { () -> Void in
// ViewControllerのmyCallback()が実行される
print("4")
// first(callback:)の引数から受け取った
// Callback用Clousureを実行
callback()
})
}
// 2. first(callback:)から実行される
func second(callback2: @escaping () -> ()) {
print("2")
// グローバル変数にcallback用Clousureを格納
// (実行するわけではない)
self.myCallback = callback2
}
}
実行結果
1
2
3
4
5