Как я могу добавить значения Json в строковые массивы? - PullRequest
1 голос
/ 25 июня 2019

Я разбираю Json с Alamofire и SwiftyJSON.Я могу видеть все данные JSON от URL.В моей консоли все ясно, но мне нужно добавить некоторые значения в строковые массивы.Как вы можете видеть значения JSON.Я создаю 3 строковых массива.Мне нужно добавить в массивы команды, имена игроков и трофеи.Я перечислю команду и имя игрока в таблице.Мне нужна помощь для добавления значений в массивах

// значения json в консоли

[
  {
    "id" : 1,
    "team" : "Liverpool",
    "players" : [
      {
        "id" : 2,
        "name" : "Alisson",
        "position" : "Goal Keeper",
        "number" : "13"
      },
      {
        "id" : 3,
        "name" : "Salah",
        "position" : "Forward",
        "number" : "10"
      }
    ],
    "trophies" : [
      "2019 champions league",
      "2005 champions league"
    ],
    "logoUrl" : "url"
  },
  {
    "id" : 4,
    "team" : "Real Madrid",
    "players" : [
      {
        "id" : 5,
        "name" : "Ramos",
        "position" : "Defender",
        "number" : "4"
      },
      {
        "id" : 6,
        "name" : "Benzema",
        "position" : "Forward",
        "number" : "9"
      }
    ],
    "trophies" : [
      "2018 champions league",
      "2017 champions league",
      "2016 champions league"
    ],
    "logoUrl" : "url"
  }
]


import Alamofire
import SwiftyJSON

var team = [String]()
var playerName = [String]()
var trophies = [String]()

func fetchJsonData(){
       DispatchQueue.main.async {
            Alamofire.request(url).responseData { response in
            guard let data = response.data else { return }
            do {
                let res = try JSONDecoder().decode([PageData].self, from:data)
                print(res)
            } catch  {
                print("having trouble converting it to a dictionary" , error)
            }
        }

        }
}

// this is my modal file

struct PageData: Codable { 
    let team: String?
    let players: [Player]
    let trophies: [String]
    let logoUrlL: String?
}

struct Player: Codable {
    let id: Int 
    let name,position, number: String?
}

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Вам нужно сделать

1 - объявить массив как

var arr = [PageData]()

2- Назначьте здесь и перезагрузите

arr = try JSONDecoder().decode([PageData].self, from:data)
self.tableView.reloadData()

3- Установить источник данных и делегировать

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CellName
    let item = arr[indexPath.row]
    cell.teamlbl.text = item.team
    cell.playerslbl.text = item.players.map{ $0.name}.joined(separator:"-")
    cell.trophieslbl.text = item.trophies.joined(separator:"-")
    return cell
}

Изменить:

  var teams = [String]()
  var players = [Player]()
  var trophies = [String]()


  arr = try JSONDecoder().decode([PageData].self, from:data)
  self.teams = arr.compactMap { $0.team }
  self.players = arr.flatMap { $0.players }.compactMap { $0.name }
  self.trophies = arr.flatMap { $0.trophies } 
  self.tableView.reloadData()
0 голосов
/ 25 июня 2019

Первый make res mutable

var res = try JSONDecoder().decode([PageData].self, from:data)

Добавить игрока в Ливерпуль

if let index = res.firstIndex(where: { $0.name == "Liverpool"}) {
   res[index].players.append(Player(id: 7, name: "Virgil van Dijk", position: "Defender", number: "4"))
}

Добавить трофей в Реал Мадрид

if let index = res.firstIndex(where: { $0.name == "Real Madrid"}) {
   res[index].trophies.append("None in 2019")
}

Добавить команду

res.append(PageData(team: "Paris Saint-Germain", 
                    players: [Player(id: 8, name: "Neymar Jr.", position: "Forward", number: "10")], 
                    trophies: ["Ligue 1 2019"]))

А по вашему коду вы не используете SwiftyJSON

...