[Swift] @escaping
@escaping
Non-Escaping Closure
func runClosure(closure: () -> Void) {
closure()
}
1.runCloseにモジュールを送信
2.転送されたclosure()を実行します.
3.運転クローズ
Escaping Closure
class ViewModel {
var completionhandler: (() -> Void)? = nil
func fetchData(completion: @escaping () -> Void) {
completionhandler = completion
}
}
完了モジュールはただし、@experit付きエンクロージャでは、必ずしもexperitエンクロージャのみがパラメータとして使用できるとは限りません.
Non- Escaping Closure + @escaping
func runClosure(closure: @escaping () -> Void) {
closure() // ✅ closure는 non-escaping 클로저이지만 @escaping 사용 가능
}
ただし、逆に@exportのないcloserパラメータでは、expose closerを渡すことはできません.Escaping Closure + Not @escaping
class ViewModel {
var completionhandler: (() -> Void)? = nil
func fetchData(completion: () -> Void) { // ❗️@escaping 누락으로 컴파일 에러 발생!
completionhandler = completion
}
}
これにより,関数宣言子にすべてのcloserパラメータ@expressionを加えるだけでよいと考えられる.しかし、コンパイラのパフォーマンスを最適化するために、このように分けて使用されます.参照元
non-expervateモジュールは、コンパイラがモジュールの実行をいつ終了するかを知っているため、モジュールで使用される特定のオブジェクトに対するretain、releaseなどの処理を省略することで、オブジェクトのライフサイクルを効率的に管理できる場合がある.
一方、esacpingモジュールは関数の外で動作するため、モジュールで使用されるオブジェクトを追加の参照ループ(reference cycle)管理して、モジュールが関数の外で正常に動作していることを確認する必要があります.これはコンパイラのパフォーマンスと最適化に影響するため、SWIFTは必要に応じてエスケープモジュールのみを使用します.
ソース:https://jusung.github.io/Escaping-Closure/
Reference
この問題について([Swift] @escaping), 我々は、より多くの情報をここで見つけました https://velog.io/@loinsir/Swift-escapingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol