2017-01-16 8 views
1

私はSwiftの補完ハンドラについて学んできましたが、私の質問に対する答えを見つけることができないようです。複数の補完ハンドラがある場合は、専用の場所に置く必要がありますか?例えば、私は、コードを持つことができます。私の機能にcompletionHandlerを入れる場所Swift 3

func example(x:Int, completionHandler: @escaping (_ success: Bool) ->()){ 
    if x > 5 { 
     completionHandler(true) 
    } 
    completionHandler(false) 
} 

または私はelseステートメント内completionHandler(false)を囲む必要があります(たとえば、完了ハンドラは、互いに排他的なスポットである必要はありますか。)?もしそうなら、誰かが上記のシナリオがどのように働くかを説明することができますか?私は、関数内のすべてのコードが実行を終了した後に完了ハンドラを「戻り値」として理解する方法です。上記のシナリオには2つの異なる "戻り値"がありますか?

また、2番目のcompletionHandlerとx = 4が含まれていないとどうなりますか?この関数を呼び出すコードにどのような影響がありますか?

ありがとうございます!あなたが見ることができるようにあなたが最初の引数として6を渡す場合

+0

以下の結果を見ることができます。 – vacawama

+0

私はそれを試みます。私は、完了ハンドラがFirebaseを使用していることを要求するコードが原因で実行できないことを認識しませんでした。例をダンボールできないのを忘れてしまった... – kbunarjo

答えて

1

、あなたのclosureは二回実行されます:

  1. を使用すると、条件ブロック内を取得すると、
  2. クロージャがエスケープとして呼び出されたとき。

例として、渡された引数を結果として出力してクロージャの動作を示す1メソッドクラスを作成しました。

あなたは遊び場でそれを試してみてください

+0

'completionHandler(false)'行を取り除いて 'x = 4'を渡すと、その関数は決して最初の完了ハンドラを打つことはありません。その後何が起こるのですか?私はそれを試してみました。そして、それは一種の灰色の灰色です。それは単にクロージャを実行しないということですか? – kbunarjo

+0

@kbunarjo xに '4'を渡すと、if条件ブロックに偽の結果が得られ、ifボディに入りません。したがって、問題ではありませんが、if bodyブロックに入るものは、最初のメソッド引数が5よりも小さいか等しいことになります。 – Hamsternik

+1

@kbunarjo 'if'ブロックの後に、あなたはメソッドから引き続き前進します。 2番目の補完ハンドラを削除すると、補完ハンドラが以前に呼び出されたことがないため、このメソッドから返されます。 – Hamsternik

関連する問題