2016-06-01 7 views
0

以前はJSONデータに問題がありましたが、下方に;致命的なエラー:オプションの値をアンラッピングしている間に予期せぬエラーが発生しました//(JSON as!NSDictionary)["items"]

Ambiguous use of 'subscript' with NSArray & JSON

それはしばらくの間、正常に動作しましたが、今では致命的なエラーを返して次の行にオプションの値をアンラップしながら、予想外にnilを見つけ:(!NSDictionaryのようJSON)でビデオの[ "items"]として! NSArray {。これに関する提案はありますか?私はそれがmaxresを持っていないサムネイルに関連しているかもしれないと思ったが、それをデフォルトまたはハイに変更してもうまくいかなかった。

let API_KEY = "BrowserKey" 


    let UPLOADS_PLAYLIST_ID = "playlistID" 


    var videoArray = [Video]() 


    var delegate: VideoModelDelegate? 


    func getFeedVideos() { 

//Fetch the videos dynamically through the Youtube DATA API 
Alamofire.request(.GET, "https://www.googleapis.com/youtube/v3/playlists", parameters: ["part":"snippet", "playlistId":UPLOADS_PLAYLIST_ID,"key":API_KEY], encoding: ParameterEncoding.URL, headers: nil).responseJSON { (response) -> Void in 


if let JSON = response.result.value { 

    var arrayOfVideos = [Video]() 


    for video in (JSON as! NSDictionary)["items"] as! NSArray { 


     // create video objects off of the JSON response 

     let videoObj = Video() 
     videoObj.videoId = video.valueForKeyPath("snippet.resourceId.videoId") as! String 
     videoObj.videoTitle = video.valueForKeyPath("snippet.title") as! String 
     videoObj.videoDescription = video.valueForKeyPath("snippet.description") as! String 
     videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.default.url") as! String 


     arrayOfVideos.append(videoObj) 

    } 

    //when all the video objects constructed, assign the array to the VideoModel property 
    self.videoArray = arrayOfVideos 

    //Notify the delegate that the data is ready 

    if self.delegate != nil { 
     self.delegate?.dataReady() 
    } 

} 

}

+0

(a) 'JSON'は辞書ではありませんでした。 (b)キーの「アイテム」で何も見つかりませんでした。 (c)何かを見つけましたが、配列ではありませんでした。あなたはこれらの状況を一つずつテストしなければなりません(例えば ''ガード ')し、どれが保持していないかを見なければなりません。 – Rob

+0

私はちょうどこれらの問題のために[this](https://github.com/romainmenke/Jenerator)を作成しました。 JSONレスポンスをマップするには多くの時間がかかります。このcliはJSONの素早いモデルを作成します。多分それは助けます。 –

答えて

0

あなたは、このような力アンラップ演算子(!)を乱用していないのはこのためです。表現(JSON as! NSDictionary)["items"] as! NSArray

  1. あなたは強制的にNSDictionaryからJSONをキャストしています。 JSONNSDictionaryまたはそのサブクラスでない場合、この強制キャストは失敗し、クラッシュする可能性があります。
  2. "items"の値を取得するためにサブスクリプトが作成されています。これはnilを返します。"items"
  3. あなたは強制的にその値をNSArrayにキャストしています。値がnilの場合、これはクラッシュします。値がNSArrayまたはそのサブクラスの1つでない場合、これはクラッシュします。

!は控えめに使用する必要があります。アンラッピング/キャスティングが有効であることを示すアサーションが作成されます。 if let/elseステートメントのような "バックアップ"プランがないので、プログラムがクラッシュします。 意図しない予期しない状態でプログラムが実行され続けるのを防ぐため、これは意図的な設計選択です。

このデータを安全に処理してエラーに対処するには、if letguardを使用する必要があります。

+0

それを強制的にNSDictionaryが問題の一部だったので、私はそれをビデオに変更しました(JSON ["items"] as NSArray)! - <<。私はまた、videoId、サムネイルおよびその他の詳細が利用可能かどうかをチェックしました。ありがとう! –

+0

正しい答えは...私は同じ問題を抱えています – user3707644

関連する問題

 関連する問題