我正在尝试重构代码,并想在Bool
内返回closure
。当我尝试它时,它说它是未使用的并且不起作用。我可以用另一种方式来做,但是我要重复不想做的代码。我该怎么办。
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()
}
}
}
答案 0 :(得分:6)
您可能对此考虑过度。这里不需要“关闭”;不需要“完成处理程序”。没有异步发生。只需将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)
}
答案 1 :(得分:0)
您的问题是,您想返回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))
,并仅在完成块中使用结果。