2017-08-16 5 views
0

サーバーへのポストリクエストを行い、サーバーが何らかのデータで応答したときに、jsonという名前の変数に受信したデータを格納しています他の機能が、私はエラーを取得:ここではJSON「未解決識別子の使用 『』
をu包みコードであるあなたは、あなたがクラスレベルでの機能の間で共有したい変数を宣言する必要がサーバーの応答と他の機能のデータを迅速に使用する方法3

@IBAction func Login(_ sender: UIButton) { 
    guard let url = URL(string: "url was here..lol") else {return} 
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 
    let postString = "data to be posted" 
    print(postString) 
    request.httpBody = postString.data(using: .utf8) 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
    if let response = response { 
    print(response) 
    } 
     if let data = data { 
      do { 
       let json = try? JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] 
       let token = json?["access_token"] as! String 
       print (json) 

     } 
     } 
     } 
    task.resume() 

} 
+0

もう少し文脈を与えてください。現在の形で、あなたの質問は非常に曖昧です。あなたが変数の範囲を理解していないように思えます.AppleのSwift bookを出発点に読んでください。 –

+0

ここにサーバーがトークンで応答するものがあります。このトークンを変数に格納しようとしていますが、他の関数でその変数を使用しようとしていますが、何らかの理由で私はエラーが発生します:未解決の識別子 "(変数名) –

答えて

0

それを必要としますtokenはこの実装を持つクラスのインスタンスプロパティであるため、各クラスインスタンスにはtokという独自の変数がありますクラス内のどこにでもアクセスできます。

class MyViewController: UIViewController { 
    var token = "" 

    @IBAction func Login(_ sender: UIButton) { 
     guard let url = URL(string: "url was here..lol") else {return} 
     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     let postString = "data to be posted" 
     print(postString) 
     request.httpBody = postString.data(using: .utf8) 
     let task = URLSession.shared.dataTask(with: request) { data, response, error in 
      if let response = response { 
       print(response) 
      } 
      if let data = data { 
       guard let json = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String: Any] else {return} 
       guard let receivedToken = json["access_token"] as? String else {return} 
       self.token = receivedToken 
       otherFunction() 
      } 
     } 
    task.resume() 
    } 

    func otherFunction(){ 
     print(token) 
    } 
} 
+0

私はエラーは出ませんが、コンパイラが "self.token = json?[" access_token "] as" String "insted of" token = json?["access_token"] asをタイプするように指示する方法で、 –

+0

の作業ができませんでした! "と私はそうした –

+0

あなたは非同期なネットワーク要求をしているので、ネットワーク要求の完了ハンドラの中から' otherFunction'を呼び出さなければなりません。そうしないと、ネットワーク要求が返される前に値にアクセスしようとします。更新された回答を確認してください。 –

関連する問題