【Swift】クロージャのescapingについて

目次

@escapingとはなにか

関数に引数として渡されたクロージャがスコープから抜けても存在する可能性がある場合に付与する属性です。

escapingをつけることによって、クロージャが関数内部の変数をキャプチャし、関数外のスコープでも変数を保持し実行することができます。

コンパイラはescapingの有無でクロージャがキャプチャされる必要があるかを判断します。

いつ使うのか

なかなか使い時が想像しづらい属性ですが、例として、クロージャの中でクロージャで使用した場合に使用することがあります。

通信処理をラップしている処理を想像してください。SwiftのURLSessionの処理をラップしたメソッドの引数にクロージャを指定しています。GetData関数の引数に指定したクロージャには、escaping属性を付与しないとエラーになります。

エラーになる理由は、関数内部で、HTTPリクエストクロージャで使用しているからです。クロージャはスコープが独立しているので、GetData関数のクロージャは、別のスコープで実行されることになるからです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func GetData(url:String,handler: @escaping (String)->Void) -> Void {
let url = URL(string: url)! //URLを生成
let request = URLRequest(url: url) //Requestを生成

// === 別スコープ ===
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in //非同期で通信を行う
guard let data = data else { return }
let decoder : JSONDecoder = JSONDecoder()
do {
handler(objects)
} catch let error {
print(error)
}
}
task.resume()
}
Author

Daiki Iijima

Posted on

2021-07-04

Updated on

2024-04-17

Licensed under