2016-09-14 15 views
4

JSONデータから配列を塗りつぶしてテーブルを作成しようとしています。私は以下のコードを使用しますが、エラーを取得しておくのです。次のコード行にSwift 3を使用したJSONシリアル化

Type 'Any' has no subscript members

を:

self.tableData.append(jsonResult[i]["title"]! as! String) 
self.tableImages.append(jsonResult[i]["image"]! as! String) 
self.tableDesc.append(jsonResult[i]["description"]! as! String) 
self.tableValidity.append(jsonResult[i]["validity"]! as! String) 

マイコード:

let str3 = Int(str2!)! 
      let url = NSURL(string: "https://www.*****.php")! 

      let task = URLSession.shared.dataTask(with: url as URL) { (data, response, error) -> Void in 
       if let urlContent = data { 
        do { 

         let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) 


         print(str3) 

         var i = 0 

         while i < str3 { 
          print(jsonResult[i]["title"]! as!String) 
          print(jsonResult[i]["image"]! as! String) 

          self.tableData.append(jsonResult[i]["title"]! as! String) 
          self.tableImages.append(jsonResult[i]["image"]! as! String) 
          self.tableDesc.append(jsonResult[i]["description"]! as! String) 
          self.tableValidity.append(jsonResult[i]["validity"]! as! String) 

          i = i + 1 

         } 

        } catch { 
         print("JSON serialization failed") 
        }      

       } else {      
        print("ERROR FOUND HERE") 
       }     

       DispatchQueue.main.async(execute: {() -> Void in 

        self.tableView.reloadData() 

       })         

      } 

      task.resume() 
+1

この最新のブログエントリは、https://developer.apple.com/swift/blog/?id=37をご覧ください。 – Koen

答えて

4

コンパイラが認識していませんjsonResultのタイプの場合は、そのようなオプションのバインディングを使用して、たとえば次のように指定する必要があります。

if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] { 


} 

ここでは、JSONを辞書の配列としてダウンキャストしました。このif letの中であなたのループを使用すればうまくいくはずです。

4

コンパイラはタイプにJSONオブジェクトを知らない、あなたは

let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options:[]) as! [[String:Any]] 

変更可能なコンテナが全く必要とされていない実際の型にキャストする必要があります。

C- whileカウンタをインクリメントするループは非常に醜いです。それをSwiftに使わないでください。データソースがまた不器用でエラーが発生しやすいよう、複数の配列:そして、あなたはあまりにも多くの感嘆符

for item in jsonResult { 

    print(item["title"] as! String) 
    print(item["image"] as! String) 

    self.tableData.append(item["title"] as! String) 
    self.tableImages.append(item["image"] as! String) 
    self.tableDesc.append(item["description"] as! String) 
    self.tableValidity.append(item["validity"] as! String) 

} 

PSを使用しています。オブジェクト指向言語では、カスタム構造体またはクラスが望ましい

関連する問題