2017-01-31 8 views
0

クロージャが関数f1(クロージャが渡される)の内部で呼び出されるか、または別の関数に渡される可能性がある状況が発生しましたf2Swift-3:エスケープ動作と非エスケープ動作を併用したクロージャ

ここで、このクロージャのエスケープ動作をどのように定義すればよいのでしょうか。私は@escapingを入れなければならないのですか?

サンプル機能:いくつかの構文エラー、(ここでメソッドを入力)がある場合

func f1(_ completionHandler:()->()){ 
    if someFlag == true{ 
     completionHandler() 
     return 
    } 
    f2(completionHandler) 
} 

func f2(_ completionHandler:()->()){ 
    // some other magic 
} 

申し訳ありませんが、私の質問は、機能f1ためcompletionHandlerのtype属性がどうあるべきか、ですか?

+0

Okey..now私はそれを持っています。ありがとう。その混乱は、「できます」という言葉にありました。 –

+0

問題はありません、私は答えに私のコメントを移動するかもしれないと思った:) – Hamish

答えて

0

あなたが@escapingを必要とするときのルールは単純です - クロージャ関数の引数コンパイラは、単にあなたがそれをコンパイルせません(@escapingとしてマークされるを必要、それを関数呼び出しの寿命を逃れることができた場合さもないと)。したがって、それはf2の寿命を免れることはできない - あなたのサンプルコードで

completionHandlerf2@escapingとしてマークされていません。したがって、f1の生存期間をエスケープすることはできないため、f1completionHandler@escapingとマークする必要はありません。

しかし、f2それ両方のコールの寿命を逃れることができて@escapingとしてSパラメータのcompletionHandlerf2の寿命を脱出、あなたは両方f2f1をマークしなければならない可能性 'の場合。

関連する問題