Swift从闭包中获取返回值,并使用它从它内部的闭包返回

Arc*_*man 2 swift

考虑以下:

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
}
Run Code Online (Sandbox Code Playgroud)

函数的闭包myClosure捕获了一个Bool我调用的函数bool,我想用bool它从闭包中返回filter.我把它放回到bool的范围内myClosure,但封闭filter对它一无所知.如何才能达到boolfilter关闭状态恢复所需的效果?谢谢.

Cha*_*tka 9

如果闭包是非转义的,这很容易:

let my_filtered_objects = my_objects.filter { obj in
    var retVal = false
    myClosure(obj.id) { bool in
        retVal = bool
    }
    return retVal
}
Run Code Online (Sandbox Code Playgroud)

对于转义闭包,您可能需要使用信号量来确保在函数返回时闭包已完成:

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
}
Run Code Online (Sandbox Code Playgroud)

正如@Woof所说,使用调度组异步执行此操作可能会更好.