2017-08-22 9 views
1

の内側に、次の点を考慮していますことを閉鎖から復帰するためにそれを使用します。閉鎖からスウィフトのget戻り値と、それは

func myClosure(_ my_object: MyObject, completion: @escaping (Bool) -> Void) { 
    var bool: Bool 
    ... 
    completion(bool) 
} 

let my_filtered_objects = my_objects.filter { obj in 
    myClosure(obj.id) { bool in 
     return bool // doesn't return from the filter closure 
    } 
    return true // returns from the filter closure 
} 

閉鎖機能からmyClosure私はbool呼んでいるBoolをキャプチャし、私は希望を使用してfilterのクロージャから戻ってくるのが好きです。私が入れたものはをmyClosureの範囲内に返しますが、filterのクロージャは何も分かりません。 boolfilterの閉鎖から返すという希望の効果をどのように達成できますか?ありがとう。

+0

どのようなタイプが 'myClosure'ですか? –

+0

@HaydenHolligan私は自分の答えを更新しました。 –

+0

明確にするために、クロージャをフィルタの述語として使用したいですか? –

答えて

4

閉鎖は非エスケープであれば、これは簡単です:エスケープ閉鎖のための

let my_filtered_objects = my_objects.filter { obj in 
    var retVal = false 
    myClosure(obj.id) { bool in 
     retVal = bool 
    } 
    return retVal 
} 

、あなたはクロージャがあなたの関数が戻るまでに完了したことを確認するためにセマフォを使用する必要があります。

let my_filtered_objects = my_objects.filter { obj in 
    var retVal = false 
    let semaphore = DispathchSemaphore(value: 0) 

    myClosure(obj.id) { bool in 
     retVal = bool 
     semaphore.signal() 
    } 

    semaphore.wait() 

    return retVal 
} 

@Woofによると、ディスパッチグループを使用すると、これを非同期的に行うとパフォーマンスが向上する可能性があります。