首页 > 解决方案 > “返回函数”和“回调函数”的主要区别是什么?

问题描述

我想我要把我所有的代码函数从“回调函数”改为“返回函数”。我不喜欢我的代码的“楼梯”外观。

你认为这是个好主意吗?

我不明白两者之间的区别(除了强制在我的代码中使用回调函数的异步 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) {
    ...
}

使用其中一种的最佳方法是什么?我不太了解其中的微妙之处。

标签: swiftfunctioncallbackclosures

解决方案


这实际上取决于您在任何特定情况下需要什么。

对于像返回一条数据这样简单的事情,您可以这样做:

// 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 中进行更多编码,您会发现每个用例都更多。


推荐阅读