无法将“NSNull”类型的值转换为“NSString”

hel*_*ikh 3 ios uisearchresultscontroller swift uisearchcontroller

我有一个非常奇怪的问题,我无法弄清楚这里出了什么问题。

这是我的代码

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()
}
Run Code Online (Sandbox Code Playgroud)

程序在这一行崩溃

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

当我在搜索框中输入第一个字符时一切正常,但是一旦我在searchBox程序中输入第二个字符就会崩溃并给我这个错误

无法将“NSNull”(0x1a03c3768)类型的值转换为“NSString”(0x1a03cd798)。

并且对于您的信息 countryNames 存在于dict变量中,但我不知道为什么它给我空值以及为什么城市名称成功工作,因为国家也存在于我从中获取城市的同一个数组中

更新:

此行成功打印国家名称

  print("countryName is \(countryName)")
Run Code Online (Sandbox Code Playgroud)

gna*_*729 5

好吧,他们告诉你问题是什么:你得到了 NSNull 类型的结果,而 NSNull不能转换为 NSString。

您很可能正在处理 JSON,而 JSON 数据通常包含空值。

远离你的迷宫?和 !

写一些对你有帮助的代码。记住任何!如果你没有得到你所期望的,将会使你的应用程序崩溃。

当您访问字典中的键“名称”时,您需要处理存在字符串(对您来说很好)、没有(键不存在,很常见)、null(服务器明确告诉您有没什么,很常见),数字,布尔值,字典或数组。

对于这些情况中的每一种,请告诉我您想要什么结果:崩溃?一个可选的为零的字符串?空字符串?通常,如果存在字符串,则可能需要将数字转换为字符串,如果是数字,则可能需要将数字转换为字符串,如果键不存在或为空,则可能需要 nil 或空字符串,如果出现崩溃或 nil布尔值、字典或数组。

然后编写一个函数,返回正是那个。然后你使用它。当你写 (... as? NSString) 时!你告诉编译器你想要崩溃,如果它不是一个字符串,那就是你得到的。