swift 3调用函数,返回完成闭包

时间:2017-01-27 12:31:48

标签: swift closures

我是Swift的新手,我遇到了一些麻烦。我想从我的请求中获取一个值。我可以打印它作为闭包,但我希望在VC上使用字符串并使用它,但在函数登录。我无法弄清楚如何从闭包中返回。

封闭功能:

class Json {
var loginToken = ""


  public func login(userName: String, password: String) -> (Any){

let loginrequest = JsonRequests.loginRequest(userName: userName, password: password)
return makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in


  //let jsons = JSON
  print("\(JSON)")


})

}


private func makeWebServiceCall (urlAddress: String, requestMethod: HTTPMethod, params:[String:Any], completion: @escaping (_ JSON : Any) -> ()) {


    Alamofire.request(urlAddress, method: requestMethod, parameters: params, encoding: JSONEncoding.default).responseJSON { response in

        switch response.result {
        case .success(let data):
            if let jsonData = response.result.value {
                completion(jsonData)
            }
        case .failure(let error):
            if let data = response.data {
                let json = String(data: data, encoding: String.Encoding.utf8)
                completion("Failure Response: \(json)")

            }

在VC上调用函数:

let retur = Json()
    let rezultatas = retur.login(userName: "root", password: "admin01")

    print(rezultatas)

2 个答案:

答案 0 :(得分:3)

你无法从关闭中返回。另请注意,您的功能正在进行Web服务调用。遇到该部分时,控件不会立即进入该块,并且在执行该块之前整个函数执行将结束。您可以在登录功能中添加另一个完成块,而不是返回值。在login函数中添加另一个参数。

public func login(userName: String, password: String, completion: @escaping(Any)->Void)

在登录功能中,删除return语句并执行类似这样的操作

makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in
    completion(JSON)
})

当你打电话给你的登录功能时,你所要做的就是,

login(userName: "", password:""){(response) in
    print(response)
}

您将拥有您想要传递的数据

答案 1 :(得分:0)

您的方法:public func login(userName: String, password: String) -> (Any)实现了一个带有完成处理程序的方法,具体为:private func makeWebServiceCall (urlAddress: String, requestMethod: HTTPMethod, params:[String:Any], completion: @escaping (_ JSON : Any) -> ())

这意味着登录函数将花费未知的时间,因此它还需要实现一个完成处理程序(可以在闭包中完成),而不是返回一个值(不能在闭包中完成) )。