🕌
swift クロージャー→メソッド内に内部クロージャーとして定義される形のクロージャー
メソッド内に内部クロージャとして定義される形のクロージャです
あるメソッド内で定義されそのメソッドのみで使用されるクロージャのことです。そのメソッド内でのみ有効の内部クロージャです。
こちらも例を見て分解してみます。
import Foundation //非同期処理を実行するために必要
class SomeClass {
//@escapingでcompletionをエスケープクロージャとしてマークしている
//completionを関数のスコープを超えて実行されるということ
//completionは関数を超えて実行されるので
func performTask(completion: @escaping () -> Void) {
print("タスクを実行します")
// 内部クロージャ
let internalClosure: () -> Void = {
print("タスクが完了しました")
completion() // 外部で指定されたクロージャを実行
}
// タスクの実行
DispatchQueue.main.async {
// 仮の非同期処理
DispatchQueue.global().async {
// タスクの完了をシミュレート
Thread.sleep(forTimeInterval: 2.0)
internalClosure() // 内部クロージャを実行
}
}
}
}
// SomeClassのインスタンスを作成
let someObject = SomeClass()
// タスクを実行し、完了後にクロージャを実行
someObject.performTask {
print("外部クロージャが実行されました")
}
出力結果
タスクを実行します
タスクが完了しました //2秒経ってから表示される
外部クロージャが実行されました
performTaskの
内部クロージャ→internalClosure//内部クロージャと言います
外部クロージャ→completion//引数としてcompletionを受け取るので外部クロージャと言います
関数は上から下に実行されるべきですが、これは少し違いますね
理由は、内部クロージャは、呼び出されないと実行されないという部分にあります。
今回の場合、
関数performTaskの処理、"タスクを実行します"が実行される
↓
内部クロージャーはまだ呼び出されていないので
// タスクの実行 が処理される
↓
// タスクの実行で内部クロージャーを呼び出しているので内部クロージャーが実行される※それまでに、2秒経っている
↓
その後someObject.performTask自身の処理
外部クロージャが実行されましたという出力がされる
という形になります
今回僕的に覚えておきたいのが、
内部クロージャーは呼び出されるまで実行されないということでした
Discussion