Swift 从闭包中获取返回值并使用它从它所在的闭包中返回

标签 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
}

函数 myClosure 的闭包捕获了一个 Bool,我称之为 bool,我想使用 bool filter 中的闭包返回。我放置的内容返回 myClosure 范围内的 bool,但 filter 中的闭包对此一无所知。如何实现从 filter 的闭包中返回 bool 的预期效果?谢谢。

最佳答案

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

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 所说,使用调度组异步执行此操作可能性能更好。

关于Swift 从闭包中获取返回值并使用它从它所在的闭包中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45827439/

相关文章:

ios - 解除模态视图 Controller 时如何保持呈现 View Controller 的方向?

ios - IBOutlet nil 一切看起来都正常

swift - 背景颜色清晰的 UIToolbar 在 iOS 10 中变为白色

ios - 自定义 View 未初始化

swift firebase 查询返回 null with currentUser?.uid

swift - Swift 中实例属性的只读访问

ios - SpriteKit SKView 显示字段内存使用情况

ios - 如何有条件地选择要导航到的下一个 View Controller ?

ios - 从起始值到结束值绘制直线 ARKit

ios - Grouped Table View 发送 nil 但 Plain 完美运行