2017-01-27 13 views
2

私はスウィフトでは新しく、何か問題があります。私は私の要求から価値を得ようとしています。私はそれをクロージャとして印刷することができますが、私はVC上で文字列として取得し、それを使用したいが、機能上はログインです。私は閉鎖から帰る方法を理解できません。クロージャとスウィフト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

あなたの方法:private func makeWebServiceCall (urlAddress: String, requestMethod: HTTPMethod, params:[String:Any], completion: @escaping (_ JSON : Any) ->())public func login(userName: String, password: String) -> (Any)は、特に完了ハンドラを使用してメソッドを実装します。

これは、ログイン関数の時間が不明であることを意味するため、値を返す代わりに完了ハンドラ(クロージャで行うこともできます)を実装する必要があります(これは、閉鎖)。