2017-01-27 29 views
2

我是Swift新手,遇到了一些麻煩。我試圖從我的要求中獲得價值。我可以打印它作爲封閉,但我想在VC上獲得字符串並使用它,但功能登錄。我無法弄清楚如何從封閉返回。swift 3調用函數完成關閉作爲回報

功能的關閉:在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)") 

      } 

調用函數:

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

    print(rezultatas) 
+0

你不能從封閉返回。 – ebby94

+0

請參閱我對上一個問題的回答:http://stackoverflow.com/a/41889841/4063602 – pbodsk

+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) 
} 

你將有數據,你想通過這裏

+0

謝謝,得到了我的答案 –

0

你的方法:public func login(userName: String, password: String) -> (Any)實現與完成處理的方法,具體如下:private func makeWebServiceCall (urlAddress: String, requestMethod: HTTPMethod, params:[String:Any], completion: @escaping (_ JSON : Any) ->())

這意味着登錄函數將花費未知的時間量,所以它還需要實現一個完成處理程序(可以在閉包中完成),而不是返回一個值(這不能在關閉)。