swift - “返回函数”和“回调函数”的主要区别是什么?
问题描述
我想我要把我所有的代码函数从“回调函数”改为“返回函数”。我不喜欢我的代码的“楼梯”外观。
你认为这是个好主意吗?
我不明白两者之间的区别(除了强制在我的代码中使用回调函数的异步 Web 服务调用)。
回调函数:
宣言:
func methodToSelectData(strQuery : String, dataBase: String, completion: @escaping (_ result: [AnyObject]) -> Void) {
let arryToReturn : [AnyObject] = []
let contactDB = FMDatabase(path: String(methodToCreateDatabase(dataBase: dataBase)!.absoluteString) )
if (contactDB?.open())! {
let results:FMResultSet? = contactDB?.executeQuery(strQuery, withArgumentsIn: nil)
while results?.next() == true {
arryToReturn.add(results!.resultDictionary())
}
if arryToReturn.count == 0 {
completion(arryToReturn)
}
contactDB?.close()
} else {
print("Error: \(String(describing: contactDB?.lastErrorMessage()))")
}
completion(arryToReturn)
}
用法:
DBHandler.sharedInstance.methodToSelectData(strQuery:"SELECT * FROM table", dataBase: "DB.db", completion: { resultQuery in
if (resultQuery.count > 0) {
...
}
})
返回函数
宣言:
func method2ToSelectData(strQuery : String, dataBase: String) -> [AnyObject] {
let arryToReturn : [AnyObject] = []
let contactDB = FMDatabase(path: String(methodToCreateDatabase(dataBase: dataBase)!.absoluteString) )
if (contactDB?.open())! {
let results:FMResultSet? = contactDB?.executeQuery(strQuery, withArgumentsIn: nil)
while results?.next() == true {
arryToReturn.add(results!.resultDictionary())
}
if arryToReturn.count == 0 {
return arryToReturn
}
contactDB?.close()
} else {
print("Error: \(String(describing: contactDB?.lastErrorMessage()))")
}
return arryToReturn
}
用法:
let resultQuery = DBHandler.sharedInstance.method2ToSelectData(strQuery:"SELECT * FROM table", dataBase: "DB.db")
if (resultQuery.count > 0) {
...
}
使用其中一种的最佳方法是什么?我不太了解其中的微妙之处。
解决方案
这实际上取决于您在任何特定情况下需要什么。
对于像返回一条数据这样简单的事情,您可以这样做:
// Definition //
func newString(firstHalf: String, secondHalf: String) -> String {
return firstHalf + secondHalf
}
// Usage //
print(newString(firstHalf: "Hello", secondHalf: "world"))
更复杂的事情,比如数据调用,可能需要完成处理程序或闭包:
// Definition //
func getData(fromEndpoint endpoint: String, completion: (String) -> Void) {
let data = serverData(from: endpoint) //Makes the server request.
completion(data)
}
// Usage //
getData(fromEndpoint: "https://www.reddit.com/.json") { data in
doThings(with: data)
}
您不一定需要异步调用来使用闭包/回调,但它往往是最常见的用例之一。随着您在 Swift 中进行更多编码,您会发现每个用例都更多。
推荐阅读
- vba - 如何在 MS Access 2016 中进行多选下拉和搜索子表单
- python - 如何使用 LabelBinarizer 对正确的训练和测试进行一次热编码
- azure - 如何缩放 Azure 数据工厂数据流?
- html - 为什么在服务器端渲染期间使用 HTML 实体渲染 React 道具?
- reactjs - 显示未选择文件的材料 UI 上传按钮
- python - 同时迭代两个列表并尝试查找一个列表中的数字是否大于另一个列表中的项目
- elasticsearch - 使用 kafka 作为 logstash 的输入将日志推送到 elasticsearch 时出错
- r - 如何获得自定义颜色并让我的图例具有正确的标签 (ggplot)?
- jenkins - 如何在 jenkins DSL 的 groovy 脚本中使用存储在 Jenkins 中的凭据
- visual-studio - 我怎样才能始终如一地自动化,使用 TFS vNext 构建步骤,构建我们的开发团队使用 Visual Studio 工作的任何解决方案文件?