2017-01-03 4 views
0

Swift3で次のコードに問題があります。私は何が間違っているのか分かりませんが、 'リスト'を印刷しようとするとコンパイルエラー '未解決の識別子の使用'が表示されます。誰かが私に正しい方向を向けることができますか?未解決の識別子の使用 - Swift 3

let task = URLSession.shared.dataTask(with: request) { data, response, error in 

DispatchQueue.main.async { 

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 200 { 

     do { 

     let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] 

     guard let list = json?["response"] as? [[String : Any]] else { 
          return 
         } 
     } catch { 
      print("catch error...") 
      } 

    } //end of if let httpStatus 

}//end dispacth 

}//end of task 

task.resume() 

print(list) 
+1

'list'が有効範囲外(非同期ブロック)です。それを除いて、 'list'はその瞬間に空になります。 – vadian

+0

'} catch {'の直前で印刷リストを試してみてください。 –

+0

@PhillipMills私がリストを印刷する前に}キャッチすると、適切な結果が得られます。しかし、どのようにdo/catch節の外のリストからデータを扱うことができますか?リストには、TableViewに移入する必要があるデータが含まれています。私はどのようにテーブルの行にリストからデータを取得できるか分からないのですか? – Luke

答えて

0

私はlistがあなたのprintコマンドと同じスコープ内にはないので、あなたのコードがコンパイルさえ驚いて。コンパイラはそれをキャッチする必要があります。

listが本質的にはdoブロック内に定義されています。つまり、listの範囲はdoブロックに限定されています。あなたのguardの文の後で、} catch {を含む行の前に@vadianがコメントしたように、print(list)を実行します。 listは範囲内にあり、その値がnilでない限りjson?["response"] as? [[String : Any]]の値を持ちます(この場合、guardブロックは実行し、Dispatch.main.asyncブロックから戻ります)。

新しいコードは:

let task = URLSession.shared.dataTask(with: request) { data, response, error in 

DispatchQueue.main.async { 

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 200 { 

     do { 

     let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] 

     guard let list = json?["response"] as? [[String : Any]] else { 
      print("list variable is nil") 
      return 
     } 

     print(list) 

     } catch { 
      print("catch error...") 
     } 

    } //end of if let httpStatus 

}//end dispacth 

}//end of task 

task.resume() 

はまた、あなたがどんなUIの更新を行っていないので、(少なくともまだ)ここで、あなたはメインスレッド上でこのコードを実行する必要はないことに注意してください。これを代わりに使うことができます:

DispatchQueue.global(attributes: .qosDefault).async { 

} 
関連する問題