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