2016-05-29 2 views
2

スウィフトでは、私がクロージャーの中にいる場合、それ自体が別の関数の中にありますが、関数自体を終了する方法はありますか?根本の閉鎖部から速やかに脱出できますか?

これは、GCDKitライブラリのクロージャを使用した場合の例です。

func test() { 
    GCDQueue.Default.async { 
     print("Print me!") 
     return //Is there a statement that does this? 
    }.notify(.Main) { 
     print("Never print me.") 
    } 
} 

答えて

4

いいえありません。クローズは自己完結型環境で実行されます。あなたが知っている限り、クロージャが実行されるまでに、test()が呼び出されたスレッドは、test()メソッドをもう実行しません。

1

サードパーティのライブラリ、余分なキュー、または他の複雑さを含まないより単純なバージョンを考えてみましょう。クロージャを作成してただちに実行します。

func dothing(andPrint shouldPrint: Bool) { 
    let closure = { 
     guard shouldPrint else { return } 
     print("I printed!") 
    } 

    closure() 
    print("did it return?") 
} 

dothing(andPrint: false) // Prints "did it return?" 

ここreturnは閉鎖、ないdothingを終了します。 closureは他の関数に渡すことも、プロパティに格納して後で実行することもできます(returnはそれ以上のものを終了することはできません)。我々は独自の関数にクロージャの作成をリファクタリングした場合考えてみましょう:

func fetchClosure(andPrint shouldPrint: Bool) ->() -> Void { 
    return { 
     guard shouldPrint else { return } 
     print("I printed!") 
    } 
} 

func dothing(andPrint shouldPrint: Bool) { 
    let closure = fetchClosure(andPrint: shouldPrint) 

    closure() 
    print("did it return?") 
} 

dothing(andPrint: false) // Prints "did it return?" 

は、(そうでない場合、これは簡単なリファクタリングではない)、これは同じ動作を持っている驚くべきことではありません。 returnが他の方法で動作した場合、どのように動作するのか(または可能でも)想像してください。

あなたの例は、同じことのはるかに複雑なバージョンです。 returnはクロージャを終了します。

関連する問題