Неоднозначная ошибка при доступе к ключу / значениям словаря - PullRequest
0 голосов
/ 04 октября 2018

Я использую 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))
                }
        }
    }

, которая отлично работает.Он получает данные и возвращает их мне.

Я пытаюсь показать эти результаты в виде таблицы, которую я получаю, когда использую функцию submitSearch() чуть ниже этого фрагмента json

Значение 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 по адресу indexPath.row

Я пытался

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

и множество других.

Что я делаю не так?Как получить доступ к словарю в массиве?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

"Неоднозначная ссылка на элемент 'subscript'"

Эта ошибка возникает из-за того, что вы не указали тип словаря.Используйте 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)"
    }
0 голосов
/ 04 октября 2018

Проблема в том, что tableData[indexPath.row] не словарь, поэтому вы не можете использовать as для преобразования ссылки.Вам нужно использовать tableData[indexPath.row].dictionaryValue, который возвращает [String : AnyObject]?.

Я думаю, ваш код будет выглядеть примерно так:

let person = tableData[indexPath.row].dictionaryValue
let name = person?["Name"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...