如何在 Swift 的完成处理程序中返回布尔值

Posted

技术标签:

【中文标题】如何在 Swift 的完成处理程序中返回布尔值【英文标题】:How to return a Boolean in a completion handler in Swift 【发布时间】:2019-03-07 15:14:21 【问题描述】:

我正在尝试重构我的代码,并希望在 closure 中返回 Bool。当我尝试时,它说它未使用并且不起作用。我可以用另一种方式来做,但我在重复我不想做的代码。我该怎么办。

func tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool 

    // These lines are the one that work but would like to get rid of them
    if let rowConversation = self.objectAtIndexPath(pIndexPath) as? Conversation 
        if rowConversation.isGroupChat && rowConversation.expired  
            return true
        
    

    self.getRowConversation(pIndexPath: pIndexPath) 
        // how to return true here
    
    return false


private func getRowConversation(pIndexPath: IndexPath, completion pCompletion: () -> Void) 
    if let rowConversation = self.objectAtIndexPath(pIndexPath) as? Conversation 
        if rowConversation.isGroupChat && rowConversation.expired  
            ConversationManager.shared.deleteConversationID(rowConversation.conversationID)
            pCompletion()
        
    

【问题讨论】:

您不会以异步方式运行getRowConversation,因此该函数中不需要pCompletion。只需让它返回 true/false 即可。如果您的问题是“我怎样才能异步运行getRowConversation 并且仍然从tableView() 返回真/假”,那么答案是:你不能。为了使用结果值,您需要等待函数完成。 什么是objectAtIndexPath,它返回一个可选值? Conversation还有其他类型吗?代码看起来很麻烦。 【参考方案1】:

你可能想多了。这里不需要“关闭”;不需要“完成处理程序”。没有任何异步发生。只需将getRowConversation 转换为返回Bool 的普通函数即可;调用它并返回它传递给你的结果。

private func getRowConversation(pIndexPath: IndexPath) -> Bool 
    if let rowConversation = self.objectAtIndexPath(pIndexPath) as? Conversation 
        if rowConversation.isGroupChat && rowConversation.expired  
            ConversationManager.shared.deleteConversationID(rowConversation.conversationID)
            return true
        
    
    return false

然后这样称呼它:

func tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool 
    return self.getRowConversation(pIndexPath: pIndexPath)

【讨论】:

“不起作用”是什么意思?它根据给出的信息进行编译并满足问题的要求。如果有更多相关代码要展示,那就展示吧。【参考方案2】:

您的问题是您希望在交付之前返回在getRowConversation(pIndexPath: pIndexPath) 中异步生成的结果,即在tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool 中调用此函数之后立即返回。 这是不可能的,因为目前还不知道结果。 您必须更改(如果可能的话)您的函数tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath) -> Bool,以便它也有一个回调,例如tableView(_ pTableView: UITableView, canEditRowAt pIndexPath: IndexPath, completion: @escaping ((Bool) -> Void)),并且只在完成块中使用结果。

【讨论】:

以上是关于如何在 Swift 的完成处理程序中返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 函数不会很快返回

如何在 func swift 4 中编写关于比较布尔值的 func

iOS如何从解析Swift 4中获取值“布尔”

快速使用 FMDB - 返回布尔值

如何在java中检查布尔方法的返回值

如何在 Swift 中使用计时器切换布尔值