4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

@escapingを理解するための簡単なサンプルコード

Last updated at Posted at 2019-01-27

クロージャがスコープから抜けても存在し続けるときに @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

参考

Swift 3 の @escaping とは何か - Qiita

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?