2017-01-27 6 views
-1

私はすぐに新しく機能から文字列を取得することに問題がありますが、完了ハンドラを使用しようとしていますが、何かが間違っています。swift 3完了ハンドラが文字列を返す

funcに[String:String]を追加した後、私はrezultを取得できません。応答を取得して印刷します。エラー:が型を返すためにタイプの戻りexpresion()変換できません[文字列:文字列]

要求:

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

    print(rezultatas) 

エラー:関数を呼び出す

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

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

    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: 
      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) 
       print("Failure Response: \(json)") 

      } 

enter image description here

+1

*「何かが間違っている」*は役に立たない問題の説明です。 –

答えて

1

はスウィフトへようこそ:)

あなたが一緒に同期および非同期コードを混合しています。

loginに電話すると、すぐにタイプ[String : String]の返答が返されると予想されます。

しかし、あなたのloginメソッドでは、すぐに戻ることができないネットワークコールを行います...これは、Alamofire.requestへの呼び出しが完了ブロックをパラメータとして受け取る理由です。

そう...あなたはそれように、あなたのlogin方法を変更する必要があります。

  1. (それはログイン私たちは覚えてネットワーク呼び出しを行う必要が...そうすることはできません)
  2. すぐには何も返しません
  3. は、ログインが成功すると完了ブロックを呼び出して呼び出します。

これがそうのように行うことができます。

public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) ->()) 

をここでは、タイプStringuserNameをとる機能を持つタイプStringpasswordと再び[String : String]辞書を取るタイプfunctionloginCompletionパラメータとして使用します。このメソッドは何も返しません。

今、あなたはあなたのmakeWebServiceCall、ほぼ以前のように呼び出すことができます。ここでは

let loginrequest = JsonRequests.loginRequest(userName: userName, password: password) 
makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in 
    //Now we are ready, the login call has returned some data to you. 

    //You have an attribute named JSON of type Any, which you need to convert to [String : String], and then you can call loginCompletion with that, like so: 
    loginCompletion(yourConvertedDictionaryHere) 
}) 

は、その完全に新規login方法です:

public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) ->()) { 
    let loginrequest = JsonRequests.loginRequest(userName: userName, password: password) 
    makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in 
     //Now we are ready, the login call has returned some data to you. 

     //You have an attribute named JSON of type Any, which you need to convert to [String : String], and then you can call loginCompletion with that, like so: 
     loginCompletion(yourConvertedDictionaryHere) 
    }) 
} 

そして、あなたはあなたのlogin方法はそうのように呼び出す:

retur.login(userName: "root", password: "admin01") { stringDictionary: [String : String] in 
    //here you have your stringDictionary which you can use as pleased 
} 

希望はあなたを助けます。

+0

ありがとう、あなたは助けてくれました。画像。 –

+0

解決策を見つけました。助けてくれてありがとうございます。 –

+0

私はタイプを変更しようとしましたが、あなたが言うようにエラーが発生しました。私はサーバからホールレスポンスを文字列として取得して印刷する必要があります。私は私の質問を更新しました –

0

私はシンプルによるパラメータのデータ型を変更したこの

makeWebServiceCall(urlAddress: "", requestMethod: "", params: ["Key" : "value"], completion: { (JSON : Any) in 

      print("\(JSON)") 

     }) 

のように呼び出して、この

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

completion("Make a service call") 

} 

メイク機能のような関数定義を行います。また、completion("Make a service call")に任意のタイプのデータを渡すことができます。 うまくいけば、これはあなたを助けるでしょう。

+0

[OK]を私は得るが、まだ種類が間違っている、あなたは私の質問を確認することができます、私はコードとエラーの画像を編集しました –

関連する問題