2015-12-29 4 views
1

Это мой код: точка прерывания находится на. videoObj.videoThumbnailUrl =Swift Alamofire - фатальная ошибка: неожиданно найден nil при разворачивании необязательного значения - youtube api: PlaylistItems: list

Я поставил точку перерыва на. arrayOfVideos.append (videoObj). на нижней вкладке, где размещен (lldb). Я ввел: «po videoObj.videoThumbnailUrl», имея точку прерывания в .append. он вернулся с адресом. но когда я поставил точку прерывания на videoObj.videoThumbnailUrl. и ввел: «po videoObj.videoThumbnailUrl» он вернулся с пустыми кавычками »« Я пытаюсь получить данные из youtubev3api-playlist, используя метод snippet. Извлечение данных со значением для ключевого метода.

Я удалил URL-адрес. «snippet.thumbnails.maxres» и попробуйте запустить его, но я получил эту ошибку: не удалось передать значение типа «__NSCFDictionary» (0x105c4eef0) в «NSString» (0x10603fb20).

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

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.maxres.url") as! String 

       arrayOfVideos.append(videoObj) 
      } 

ответ

0

Не использовать принудительные слепки или принудительные разворачивают, как это вызывает приложение к краху, если они сталкиваются нулевые значения. Как и в вашем случае. Вместо этого используйте optional bindings и optional chaining для определения и обработки значений nil.

if let items = JSON["items"] as? NSArray { 
    for video in items { 
     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.maxres.url") as? String    
     arrayOfVideos.append(videoObj) 
    } 
} 

Пожалуйста, обратите внимание, что этот код больше не использует форсированные слепки, поэтому в неожиданностям в Youtube API не посылая некоторых из полей, то мы будем просто nil значения для тех, а не сбой.

А также мы conditionally cast до NSArray и в сочетании с условной привязкой, мы только обходим против элементов, если они на самом деле являются массивом.

+0

Я заменил «!» с "?" и получил другую ошибку. значение необязательной строки типа не развернуто: ... – Junior

+0

Это была любительская ошибка. Я заменил maxres на default/medium/high, и он прошел нормально. нет ошибок. :) Это мой первый проект, извините меня за ошибку. Спасибо, парни! – Junior

+0

@pjunior - вам помогли ответы? Если да, отметьте один, как принято. – Cristik

0

Если поместить точку останова на исходный код и поток остановился на точке останова, это означает, что breakpointed линия еще не выполнена.

Когда поток остановился на

videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.maxres.url") as! String

затем нажмите step over. Это перемещает вашу нить 1 ниже.

И вы должны быть в состоянии видеть назначенное значение videoObj.videoThumbnailUrl

+0

хорошо, я думал, что это может быть знаком к проблеме. все еще получая ошибку. фатальная ошибка: неожиданно найден nil при развертывании необязательного значения. когда я запускаю проект – Junior