访问字典键/值时出现歧义错误

时间:2018-10-04 19:06:12

标签: 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,  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))
                }
        }
    }

那很好。它获取数据并将其返回给我。

我试图在表格视图中显示这些结果,当在此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加载数据

   func submitSearch() {

            MyApiClass().post(noun: "Get", verb: "People", data: data) { (isSuccessful, result) in

                //This line loads all the array result from the People object in the above json
                self.tableData = result["Results"]["People"].arrayValue

                self.title? = "\(self.tableData.count) Found"
                self.tableView.reloadData()
            }

        }

我的问题是当我填充表格单元格时。尝试访问字典时,我不断收到"Ambiguous reference to member '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
    }

tableView(_:cellForRowAt:)期间,我创建了一个person对象,并试图将存储在tableData中的Dictionary存放在indexPath.row

上。

我尝试过

 let person = tableData[indexPath.row] as! Dictionary
 let person = tableData[indexPath.row] as? [String:String]
 let person : Dictionary = tableData[indexPath.row]

还有许多其他人。

我在做什么错?如何访问数组中的Dictionary?

2 个答案:

答案 0 :(得分:1)

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

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

let person = tableData[indexPath.row].dictionaryValue
let name = person?["Name"]

答案 1 :(得分:0)

  

“对成员'下标'的引用不明确”

出现此错误的原因是您没有为字典传递任何类型。使用as! Dictionary<String, Any>而不是as! Dictionary

您可以将tableData定义为:

    var tableData: Array<Dictionary<String, Any>> = []

或者,将现有的tableData声明更新为以下代码:

    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)"
    }