Ошибка заполнения UITableViewCells значениями из словаря - PullRequest
0 голосов
/ 18 марта 2020

У меня есть приложение iOS, которое отправляет запрос GET на мой API, чтобы получить все сообщения, которые сохраняются в базе данных.

Я пытаюсь заполнить данные, полученные в ячейки UITableView. Вот основной используемый код:

  if let jsonArray = try JSONSerialization.jsonObject(with: 
  data, options : .allowFragments) as? [Dictionary<String,Any>]
   {
                   print(jsonArray) // use the json here

                    //loop through the jsonArray (which holds the objects)
                    for deal in jsonArray {

                        //loop through indivdual objects
                        for (key, value) in deal {

                            var newDeal:Deal!

                            print(key, value)
                            if(key == "location"){
                                newDeal.address = value as! String //after assigning, newDeal is null
                            }
                            if(key == "description"){
                                newDeal.description = value as! String //after assigning, newDeal is null
                            }
                            if(key == "promotion_end"){
                                newDeal.availability = value as! String //after assigning, newDeal is null
                            }
                            if(key == "user_id"){
                                newDeal.poster = value as! String //after assigning, newDeal is null
                            }
                            if(key == "created_at"){
                                newDeal.postedOn = value as! String //after assigning, newDeal is null
                            }
                            self.deals.append(newDeal)//null error
                        }

                        //Example of Deal object:
                        //    Deal(poster: "Company name", postedOn: "2020-02-15", description: "Body of post goes here", availability: "11am-2pm Sat/Sun", address: "300 Somewhere Street")
                    }

Я перебираю каждый объект внутри jsonArray. Я проверяю имя ключа, и если ключ, например, == для «местоположения», то устанавливаю значение, связанное с ключом, по адресу, пытаясь «создать» объект Deal для каждой ячейки tableView. поскольку выполняется для l oop.

Почему используются newDeal.address, newDeal.description et c. нуль после присвоения значения? Ниже приведено несколько изображений, которые я сделал во время отладки, и формат данных.

enter image description here

enter image description here

enter image description here

1 Ответ

0 голосов
/ 18 марта 2020

На самом деле ваш код должен обработать sh, потому что вы объявляете newDeal неявным необязательным, но не инициализируете его.

l oop можно упростить, вы должны создать экземпляр Deal

for deal in jsonArray {
    let newDeal = Deal(poster: deal["user_id"] as! String,
                       postedOn: deal["created_at"] as! String,
                       description: deal["description"] as! String,
                       availability: deal["promotion_end"] as! String,
                       address: deal["location"] as! String)
    self.deals.append(newDeal)
}

Я рекомендую декодировать JSON с помощью JSONDecoder, что более удобно.

...