Swift 访问字典键/值时出现不明确错误

Swift 访问字典键/值时出现不明确错误,swift,uitableview,dictionary,swift4,Swift,Uitableview,Dictionary,Swift4,我使用Swift 4、AlamoFire和SwiftyJSON来使用API中的一些数据 我为AlamoFire创建了一个通用包装器 MyApiClass func post(_ product: String = "", noun: String, verb: String, onCompletionHandler: @escaping (Bool, JSON) -> Void) { Alamofire.request(url, method: .post, para

我使用Swift 4、AlamoFire和SwiftyJSON来使用API中的一些数据

我为AlamoFire创建了一个通用包装器

MyApiClass

  func post(_ product: String = "", noun: String, verb: String, onCompletionHandler: @escaping (Bool, JSON) -> Void) {
        Alamofire.request(url, method: .post,  parameters: package, encoding: JSONEncoding.default).responseJSON {
            response in

                let json : JSON = JSON(response.result.value!)
                if let r = json["APICall"]["Data"].dictionaryObject {
                    onCompletionHandler(true,  JSON(r))
                }
        }
    }
那很好。它获取数据并返回给我

我试图在一个tableview中显示这些结果,当我在这个json片段下面使用
submitSearch()
函数时,我会得到这个结果

JSON值

{
  "Results": {
    "People": [
      {
        "Name": "John Smith",
        "Address": "123 Main Str",
        "Age": "47"
      },
      {
        "Name": "Jane Smith",
        "Address": "1234 E Main Str",
        "Age": "27"
      }
    ]
  }
}
我的搜索函数,用于加载UITableView的数据

我的问题是当我填充表格单元格时。在尝试访问字典时,我不断收到
“对成员“subscript”的模糊引用”
和其他错误

var tableData : Array<Any> = []

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

        let person = tableData[indexPath.row] as! Dictionary
        let name = person["Name"]

        cell.textLabel?.text = "Name: \(String(describing: name))"

        return cell
    }
还有许多其他的


我做错了什么?如何访问数组中的字典?

问题是
tableData[indexath.row]
不是字典,因此不能使用
as
转换引用。您需要使用
tableData[indexath.row].dictionaryValue
,它返回一个
[String:AnyObject]?

我认为您的代码将如下所示:

let person = tableData[indexPath.row].dictionaryValue
let name = person?["Name"]
“对成员“下标”的引用不明确”

出现此错误是因为尚未传递字典的任何类型。使用
as!字典
而不是
as!字典

您可以将
表格数据定义为:

    var tableData: Array<Dictionary<String, Any>> = []
或者具有更好的错误处理能力

    if let person = tableData[0] as? Dictionary<String, Any>, let name = person["name"] as? String {
        cell.textLabel?.text = "Name: \(name)"
    }
如果让person=tableData[0]作为?字典,让name=person[“name”]as?串{
cell.textlab?.text=“名称:\(名称)”
}

根据我对Codable的理解,我必须为任何API调用/结果创建一个新类。这似乎太过分了。如果json数据发生变化,我就必须改变容器类。如果格式发生变化,是的,你就必须这样做。但是您的代码需要某种格式,不是吗?一个JSON API可以在你背后突然改变API,这不是一个很好的API,是吗?这些考虑并没有阻止其他人更新为可解码的,所以很难看出它们是如何构成一个有效的借口的。
    var tableData: Array<Dictionary<String, Any>> = []
    let person = tableData[0] as? Dictionary<String, Any>
    let name = (person?["name"] as? String) ?? ""
    cell.textLabel?.text = "Name: \(name)"
    if let person = tableData[0] as? Dictionary<String, Any>, let name = person["name"] as? String {
        cell.textLabel?.text = "Name: \(name)"
    }