2017-09-04 2 views
-1

Webサーバー上の外部JSONファイルから文字列を取得しようとしていますが、正常に取得されますが、値を取得するクロージャの内側にあります。私はそれを外に出す必要があるので、変数returnipで返すことができます。これをどうやって行うのですか?あなたは、非同期機能のみ閉鎖自体から返すクロージャ内のreturn文から戻ることはできません閉鎖内で指定された変数を返す - Swift

func getJsonFromUrl() -> String { 

    let URL2 = "https://url.com/asd.php"; 
    let url = URL(string: URL2) 
    URLSession.shared.dataTask(with:url!) { (data, response, error) in 
     if error != nil { 
      print(error as Any) 
     } else { 
      do { 

       let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:Any] 
       let ips = parsedData["ip"] as! String 
       print("The IP is: " + ips) //Prints the value correctly 
       var returnip = ips //The value that I want to return, that does not go outside this closure 
      } catch let error as NSError { 
       print(error) 
      } 
     } 

     }.resume() 
    return returnip //Does not return anything 
} 

おかげ

+0

func getJsonFromUrl(name: String, completion: @escaping (String?)->()) { //use name variable just as you would in a normal function let URL2 = "https://url.com/asd.php" let url = URL(string: URL2) URLSession.shared.dataTask(with:url!) { (data, response, error) in if error != nil { print(error as Any) completion(nil) } else { do { guard let parsedData = try JSONSerialization.jsonObject(with: data!) as? [String:Any] else { completion(nil); return } guard let ips = parsedData["ip"] as? String else {completion(nil); return } print("The IP is: " + ips) //Prints the value correctly completion(ips) } catch let error as NSError { print(error) completion(nil) } } }.resume() } 

次に、あなたがこのようにそれを呼び出すことができます。 Web呼び出しは非同期です。 URL呼び出しが完了する前に戻ります。 – ryantxr

答えて

1

代わりに補完ハンドラを使用する必要があります。また、ネットワークレスポンスの解析時にオプション/強制キャストオプションの強制アンラッピングを使用しないでください。あなたは、このようにそれを行うことはできません

getJsonFromUrl(name: "Input", completion: { ips in 
    print(ips) 
    //you can only use the value inside the closure of completion 
}) 
+0

関数に引数がある場合、私は何をしますか?例、 'func getJsonFromUrl(name:String、completion:@escaping(String?) - >()){}'。それが機能を作り出す方法なのですか?どのようにそれを呼びますか? – FrankFabregat

+0

ところで、 'dataTask(with:URL)'はバックグラウンドキューで実行されます。だから、あなたはUIに関連する仕事をする必要がある場合は、メインキューでそれをしてください。 – antonio081014

+0

ちなみに、私はそれを変数として呼び出す必要があります。 '変数= getJsonFromUrl(name:name、completion:{ips in print(ips) })'を変数として呼び出す必要があります。あれは正しいですか? – FrankFabregat

関連する問題