如何在 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 的完成处理程序中返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章