无法将类型'__NSDictionaryI'的值强制转换为'NSArray'

时间:2018-09-27 12:19:43

标签: swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

  @IBOutlet weak var TableViewOutlet: UITableView!

 let URL_GET_DATA = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=17.500010,78.461527&radius=1000&types=atm&key=AIzaSyA4G66cD6FTzU1UnLO2UHL2rpehzDNa2v4"

 var icons = [Icon]()


override func viewDidLoad() {
    super.viewDidLoad()

    Alamofire.request(URL_GET_DATA).responseJSON { response in


        if let json = response.result.value {

            let iconArray : NSArray  = json as! NSArray

            for i in 0..<iconArray.count{

                self.icons.append(Icon(
                    name: (iconArray[i] as AnyObject).value(forKey: "name") as! String,
                    imageUrl: (iconArray[i] as AnyObject).value(forKey: "imageUrl") as! String
                ))
            }

            self.TableViewOutlet.reloadData()
        }

    }

    self.TableViewOutlet.reloadData()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return icons.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "one", for: indexPath)as? TableViewCell

    let icon: Icon
    icon = icons[indexPath.row]

    cell?.nameOutlet.text = icon.name

    Alamofire.request(icon.imageUrl).responseImage { response in
        debugPrint(response)

        if let image = response.result.value {
            cell?.ImageOutlet.image = image
        }
    }
    return cell!
}

}

我遇到这样的错误

  

无法将类型'__NSDictionaryI'(0x10a439508)的值强制转换为'NSArray'(0x10a439008)。   2018-09-27 17:42:43.020278 + 0530 TableViewJSON [14887:1123768]无法将类型'__NSDictionaryI'(0x10a439508)的值强制转换为'NSArray'(0x10a439008)。

在第30行,我说错了

  

线程1:信号SIGABRT

1 个答案:

答案 0 :(得分:1)

错误非常明显:json是字典([String:Any]),而不是数组。根本不要在Swift中使用NSArray以及可怕的as AnyObject).value(forKey:

并且始终有条件地绑定值以避免崩溃

...
   if let json = response.result.value as? [String:Any], // <- Swift Dictionary
      let results = json["results"] as? [[String:Any]]  { // <- Swift Array

      for result in results {
          print(result["name"] as! String)
      }

JSON中根本没有密钥imageURL