スウィフトの「クロージャ」をより正確に理解しようとしています。
しかし@escaping
、Completion Handler
理解するのが難しすぎる
私は多くのSwiftの投稿や公式文書を検索しましたが、それでもまだ十分ではないと感じました。
これは公式文書のコード例です
var completionHandlers: [()->Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
completionHandlers.append(completionHandler)
}
func someFunctionWithNoneescapingClosure(closure: ()->Void){
closure()
}
class SomeClass{
var x:Int = 10
func doSomething(){
someFunctionWithEscapingClosure {
self.x = 100
//not excute yet
}
someFunctionWithNoneescapingClosure {
x = 200
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
使用には2つの方法と理由があると聞きました @escaping
1つはクロージャの格納用、2つ目は非同期操作用です。
以下は私の質問です:
まず、doSomething
execute someFunctionWithEscapingClosure
を実行すると、クロージャーパラメーターを使用して実行され、そのクロージャーはグローバル変数配列に保存されます。
閉鎖は{self.x = 100}だと思います
self
グローバル変数に保存された{self.x = 100}ではcompletionHandlers
、instance
そのオブジェクトにどのように接続できますSomeClass
か?
第二に、私someFunctionWithEscapingClosure
はこのように理解しています。
ローカル変数のクロージャcompletionHandler
をグローバル変数の 'completionHandlers we using
@ escaping`キーワードに保存するには!
@escaping
キーワードsomeFunctionWithEscapingClosure
が返されない場合、ローカル変数completionHandler
はメモリから削除されます
@escaping
その閉鎖を記憶に留めておくことです
これは正解?
最後に、この文法の存在について疑問に思います。
多分これは非常に初歩的な質問です。
特定の関数の後に関数を実行させたい場合。特定の関数呼び出しの後に関数を呼び出さないのはなぜですか?
上記のパターンの使用とエスケープコールバック関数の使用の違いは何ですか?