2017-07-11 17 views
-2

私はそれをどのようにしても、自分のコードをコンパイルできないようです。もう一つの視点が必要だと思う。 "聞かせて画像=データ[" 画像 "]でSwift 3 JSON Bug?

として[文字列:ANYOBJECT]!":インデックスで '[ANYOBJECT] [文字列]'

Xcodeは型の値を添字できない」私に告げる保ちますタイプの「文字列」」スウィフト3内のすべての

func retreiveInstagramMedia() { 
    let token = user?.token 
    let urlString = "https://api.instagram.com/v1/users/self/media/recent/?access_token=\(token!)" 
    let url = URL(string: urlString) 
    URLSession.shared.dataTask(with: url!, completionHandler: { 
     (data, response, error) in 
     if(error != nil){ 
      print("error") 
     }else{ 
      do{ 
       let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject] 

       if let data = json["data"] as? [[String : AnyObject]] { 
         let image = data["images"] as! [String : AnyObject] 
         let standardResolution = image["standard_resolution"] as! [String : AnyObject] 
         let url = standardResolution["url"] as! String 
         print(url) 


       } 

       OperationQueue.main.addOperation({ 
        self.tableView.reloadData() 
       }) 

      }catch let error as NSError{ 
       print(error) 
      } 
     } 
    }).resume() 
} 
+3

Swift 3でもJSONバグでもありません。 - 'data'は辞書の*配列*です。すでにエントリを繰り返していますが、わからない理由でループ変数としてワイルドカード '_'を使用します。 –

+0

あなたは配列か辞書を最初に調べます。そうでない場合は、このhttps://github.com/SwiftyJSON/SwiftyJSONを使います。 –

+0

@BHAVIKPANCHALデータを印刷するには[[String:AnyObject]]を使用する必要があります – Alexyesiam

答えて

1

あなたのdataは辞書の配列です。だから、これらの辞書を反復処理:

if let arrayOfData = json["data"] as? [[String : Any]] { 
    for individualData in arrayOfData { 
     if let image = individualData["images"] as? [String : Any], 
      let standardResolution = image["standard_resolution"] as? [String : Any], 
      let url = standardResolution["url"] as? String { 
       // now do something with URL 
       print(url) 
     } 
    } 
} 

私はあなたがキャスト/アンラップを強制的に!の使用を避けることをお勧めしたいです。リモートソースからデータを処理する場合、これらのサブスクリプトの1つが期待どおりのものを取得できない状況を、より適切に処理する必要があります。

1

まずJSON辞書は[String:Any]

あなたの間違い(開発者のバグ)であるが、ループのインデックス変数として配列dataを使用することです。 はanItemで下線を交換しanItem["images"]

let json = try JSONSerialization.jsonObject(with: data!) as! [String : Any] 

    if let data = json["data"] as? [[String : Any]] { 
     for anItem in data { 
      let image = anItem["images"] as! [String : Any] 
      let standardResolution = image["standard_resolution"] as! [String : Any] 
      let url = standardResolution["url"] as! String 
      print(url) 
     } 
    } 

注で画像を取得する:キーimages値も配列とすることができるように、複数の項目を意味しています。

+0

[ドキュメント](https://www.instagram.com/developer/endpoints/users/#get_users_media_recent_self)によると、 images'は辞書であり、配列ではありません。 – Rob

+0

@Rob説明のためにありがとう。名前は直感的ではありません。 – vadian