2016-02-24 2 views
0

У меня возникла очень странная проблема, и я не могу понять, что здесь происходит.Не удалось присвоить значение типа «NSNull» в «NSString»

Вот мой код

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    filterTableData.removeAll(keepCapacity: false) 
    let searchWord = searchController.searchBar.text! 

    getCountriesNamesFromServer(searchWord) 

    let searchPredict = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!) 

    newTableData = [String]() 

    for var i = 0; i < self.dict.count - 1; i++ { 

     let cityName = (((self.dict["\(i)"] as?NSDictionary)!["City"] as?NSDictionary)!["name"] as?NSString)! as String 
     let countryName = (((self.dict["\(i)"] as?NSDictionary)!["Country"] as?NSDictionary)!["name"] as?NSString)! as String 

      print("countryName is \(countryName)") 





    newTableData.append(cityName) 
    } 
    print("newTableData is \(newTableData)") 
    let array = (newTableData as NSArray).filteredArrayUsingPredicate(searchPredict) 
    print("array is\(array)") 
    filterTableData = array as! [String] 
    self.tableView.reloadData() 
} 

Программа сбой в этой строке

let countryName = (((self.dict["\(i)"] as?NSDictionary)!["Country"] as?NSDictionary)!["name"] as?NSString)! as String 

при вводе первого символа в поле поиска все работает нормально, но как только я набираю второй символ в searchBox сбоев программы, и это дает мне эту ошибку

Не удалось присвоить значение типа «NSNull» (0x1a03c3768) в «NSString» (0x1a03cd798).

и для информации countryNames существует в переменной dict, но я не знаю, почему его дает мне пустое значение и почему название города успешно работает, потому что страна также существует в том же массиве, из которого я получаю город

UPDATE:

Эта строка печатает название страны успешно

print("countryName is \(countryName)") 
+0

Прежде всего, вы можете взорвать линию сбоев в нескольких строках, чтобы узнать, что именно линия вылетает? – thedjnivek

+0

извините, что это значит. Я тебя не понял? – hellosheikh

+0

попытайтесь напечатать '((self.dict [" \ (i) "] как? NSDictionary)! [" Страна "] как NSDictionary)'. Я думаю, что ключ 'name' не установлен – thedjnivek

ответ

4

Ну, они говорят вам, что пробл em is: У вас есть результат типа NSNull, и NSNull не может преобразовать в NSString.

Скорее всего, вы обрабатываете JSON, а данные JSON часто содержат нулевые значения.

Уйти от своего лабиринта? а также !

Напишите код, который поможет вам. Помните, что любой! приведет к сбою вашего приложения, если вы не получите то, что ожидаете.

Когда вы получаете доступ к ключевому «имени» в словаре, вам нужно обработать случай, когда есть строка (хорошо для вас), ничего (ключ не существует, очень распространен), null (сервер сообщает вы явно говорите, что нет ничего, очень распространенного), числа, bool, dict или array.

Для каждого из этих случаев скажите мне, что вы хотите в результате: авария? Необязательная строка, которая равна нулю? Пустая строка? Как правило, вам нужна строка, если она есть, возможно, число, преобразованное в строку, если оно является числом, и либо nil, либо пустая строка, если ключ отсутствует или null, и либо авария, либо nil, если вы получаете bool, словарь или массив.

Затем напишите функцию, которая возвращает именно это. И затем вы его используете. Когда вы пишете (... как? NSString)! вы сообщите компилятору, что вы хотите аварии, если это не строка, и это то, что вы получили.

+0

Большое спасибо. разрывы строк приходили в страны, такие как this \ r .. Теперь я удалил его из базы данных – hellosheikh

0

Вы получили список страны с сервера на этой линии

getCountriesNamesFromServer(searchWord) 

Но я думаю, что его возвращение вам список без всех DATAS полностью установлены.

for var i = 0; i < self.dict.count - 1; i++ { 

      let cityName = (((self.dict["\(i)"] as?NSDictionary)!["City"] as?NSDictionary)!["name"] as?NSString)! as String 
      let countryName = (((self.dict["\(i)"] as?NSDictionary)!["Country"] as?NSDictionary)!["name"] as?NSString)! as String 

      print("countryName is \(countryName)") 

      newTableData.append(cityName) 
     } 

На первой итерации вашего цикла значение name правильно установлен так, что работает, но на второй итерации, то есть, на мой взгляд, null и вы не можете бросить NSNull в NSString около того сбои приложения.

Перед тем как приступить к кастомизации до NSString, если вы не уверены в ответе сервера, вы должны попробовать, если словарь содержит ключ name, и если значение установлено. Если это так, вы можете попробовать его бросить.

Если вы хотите, вы также можете использовать внешнюю библиотеку SwiftyJSON, чтобы упростить синтаксический анализ ответа JSON.

Смежные вопросы