2017-06-04 8 views
0

私が取得しています問題は、私はエラーに変数「jsonの」初期化される前に閉鎖によって捕獲

可変得続けることですスウィフト3.使用して簡単なgetJson関数を作成しようとしている「JSONを」終了前にクロージャによってキャプチャされました

私はSwiftには新しく、なぜ変数を宣言できず、後で道路に値を割り当てることができないのか非常に混乱しています。あたかも私がやっていることはすべて正しいと思われますが、うまくいかないようです。ここで

は私の関数である。

func getJson(url: String) -> AnyObject { 
    var json:AnyObject 
    let url = URL(string: url) 
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     if error != nil { 
      print("Error"); 
     } else { 
      if let content = data { 
       do { 
        // Convert JSON to array 
        json = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 
       } catch { 

       } 
      } 
     } 
    } 
    task.resume(); 
    return json 
} 

すべてのすべてのヘルプは素晴らしいことだ、ありがとう!

+3

あなたは 'json':' var json:AnyObject'を宣言していますが、キャプチャする前に初期化していません。それ以外は、 'dataTask'が非同期で動作するため、あなたのコードはまったく動作しません。 Btw:Swift 3では、指定されていないJSONタイプが 'Any'です。 – vadian

答えて

0

コード内で修正する必要があることはたくさんあります。

1)httpリクエストにはAlamofire 、json解析にはSwiftyJSONなどの外部パッケージを使用することをおすすめします。あなた自身でこれらのものを処理しようとすると、コードがエラーを起こしやすくなります。

2)指定されていないJSONタイプがAnyなので、json変数をタイプAnyと宣言する方が良いです。

3)jsonという名前の変数を宣言しましたが、初期化していません。 var json: Any?のようにオプションとして宣言する方が良いでしょう。オプションとして宣言したくない場合は、デフォルト値を定義することができます。var json: Any = [:] as Any

4)スレッドで要求を実行していますが、スレッドがジョブを完了する前に関数が戻ります。関数に戻り値は必要ありません。応答jsonは2つの異なる方法で処理できます。 a)あなたの要求に関数を渡して、それに応答を渡すことができます。 b)NotifcationCenterを使用して、リクエストが完了したときに通知を送信できます。

関連する問題