2017-09-15 12 views
10

[スウィフト]スウィフト@escapingと完了ハンドラ

こんにちは、私はより正確スウィフトの「閉鎖」を理解しよう。

しかし@escapingCompletion Handlerは、私は多くの投稿とスウィフトの公式文書を検索

理解するには余りにも難しいですが、私はSTIL感じられない。これは、公式文書のコード例である

十分

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) 

@esacpingを使用する2つの方法と理由があると聞きました

最初にdoSomethingsomeFunctionWithEscapingClosureが閉鎖パラメータで実行し、その閉鎖は、グローバル変数、配列に保存されます、次に実行する場合は閉鎖をtoring、第二には、非同期操作の目的

されて、今から、彼らは私の質問

まずあるの。

は私が閉鎖{self.x = 100}

どのようselfグローバル変数に保存されている{self.x = 100}でcompletionHandlersinstanceに接続できるSomeClassのオブジェクトであることと思いますか?

第2に、私はこのようにsomeFunctionWithEscapingClosureを理解しています。

グローバル変数 'c​​ompletionHandlers`にローカル変数クロージャcompletionHandlerを格納するには、@escapingキーワードを使用してください!この権利は、キーワードsomeFunctionWithEscapingClosureリターンを@escapingなし

、ローカル変数completionHandler

@escapingはメモリ

でその閉鎖を保つメモリからさ削除しますか?

最後に、私はこの文法の存在について疑問に思います。私たちは、なぜ我々だけ

は何をしている特定の関数呼び出しの後にいくつかの機能を呼び出すことはありませんいくつかの特定の機能

後に実行するいくつかの関数にしたい場合は

は多分これは非常に初歩的な質問

です上記パターンの使用とエスケープコールバック関数の使用の違い

長い質問をお読みいただきありがとうございます。私はネイティブではありません。

答えて

14

まず第一に、私が言いたい、「非常に良い質問を:)」

完了ハンドラ:

を、それを使用している間、ユーザーがアプリを更新しているものとします。あなたは間違いなくそれが完了したときにユーザーに通知したい。あなたはおそらく、「おめでとうございますが、今、あなたは完全に楽しむことができます!」

だから、どのようにダウンロードが完了した後にのみ、コードのブロックを実行しない、というボックスをポップアップ表示したいですか?さらに、ビューコントローラを次のビューコントローラに移動した後でのみ、特定のオブジェクトをどのようにアニメーション化しますか?さて、上司のようにデザインする方法を見つけるつもりです。 は私の広大な語彙リストに基づいて、完了ハンドラは親切に詳細については、

Do stuff when things have been done

放置this blog postをご覧ください。

このリンクは、私に完了ハンドラ(ビューの開発者の視点から、それはまさに私たちが理解する必要があるかを定義)についての完全な透明性を提供します。

@escaping閉鎖:あなたは、関数の本体が実行されます後にそれを使用して、関数の引数にクロージャを渡すとバック​​コンパイラを返している

。関数が終了すると、渡されたクロージャのスコープが存在し、クロージャが実行されるまでメモリに存在します。

  • ストレージ::

    含む関数にクロージャをエスケープする方法はいくつかありますがのメモリ、過去に存在してグローバル変数、プロパティ内の閉鎖や他のストレージを格納する必要がある場合関数getを呼び出し、コンパイラを戻します。

  • 非同期実行:デスパッチキューで非同期にクロージャを実行すると、キューはメモリ内のクロージャを保持し、将来使用できます。この場合、クロージャがいつ実行されるのか分かりません。

あなたはスウィフト、コンパイラはエラーが表示されますこれらのシナリオでクロージャを使用してみてください。このトピックについての詳細明確にするために

error screenshot

あなたはthis post on Mediumをチェックアウトすることができます。

私はあなたがこのリンクから良い理解を得ることを願っています。

まだご質問は(しかし、最初の行で、このリンク線を必ずお読みください。それは非常によく説明しています)場合は、あなたのコメントを共有すること自由に感じ。

おかげ

+0

あなたのリンクは –

+0

おかげで非常に有用だった、スウィフトにコーディング楽しみます –

関連する問題