SWIFT Показать отфильтрованный массив JSON на контроллере табличного представления - PullRequest
0 голосов
/ 02 апреля 2020

Я новичок, и в настоящее время работаю над этим проектом, занимающимся практикой. Я пытаюсь получить данные из JSON и отфильтровать данные по стране (ниже я фильтрую только данные Италии). Затем я хочу сохранить этот фильтрованный массив в dataArray и показать его в табличном представлении, но он не работает. Пожалуйста, дайте мне знать, что мне не хватает. Спасибо!

import Foundation
import UIKit
import CoreLocation
import SwiftyJSON

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


    @IBOutlet weak var label1: UILabel!

    struct Spot : Decodable {
        let Province: String
        let Country : String
        let Last_Update : String
        let Confirmed : String
        let Deaths : String
        let Recovered : String
        let Latitude : String?
        let Longitude : String?

        enum CodingKeys: String, CodingKey {
            case Province = "Province/State"
            case Country = "Country/Region"
            case Last_Update = "Last Update"
            case Confirmed
            case Deaths
            case Recovered
            case Latitude
            case Longitude
        }
    }

    @IBOutlet weak var TableView: UITableView!

    //Constants

    let covid_URL = "https://raw.githubusercontent.com/zmsp/coronavirus-json-api/master/latest.json"
    var dataArray : [[String : Any]] = []
    let cellReuseIdentifier = "cell"

    override func viewDidLoad() {
        super.viewDidLoad()

        self.TableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        TableView.delegate = self
        TableView.dataSource = self

        getData()

        TableView.reloadData()
    }

    @IBAction func getButtonPressed(_ sender: UIButton) {



    }


    //MARK: - Networking

    //getData method:
    func getData () {

        let url = URL(string: covid_URL)!

        let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
            guard let data = data else { return }
            let decoder = JSONDecoder()

            do {
                let rates = try decoder.decode([Spot].self, from: data)
                let rate = rates.filter { $0.Country == "Italy"}
                let dataArray = rate

                self.TableView.reloadData()
            }

            catch {
                print("Error after loading",error)
            }
        }.resume()

    }

    func numberOfSections(in tableView: UITableView) -> NSInteger {
        return 1
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        var dict = dataArray[indexPath.row] as! [String : String]
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        let confirmed = dict["Confirmed"]
        cell.textLabel!.text = confirmed

        return cell
    }
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020
let rate = rates.filter { $0.Country == "Italy"}
self.dataArray = rate // Instead of creating new object, assign to previously declared

self.TableView.reloadData()

Также, обновите это

var dataArray : [Spot] = []
0 голосов
/ 02 апреля 2020

Удалите ключевое слово let из dataArray в вызове API, где вы назначаете данные фильтра. То есть

do {
    let rates = try decoder.decode([Spot].self, from: data)
    let rate = rates.filter { $0.Country == "Italy"}
    dataArray = rate
    self.TableView.reloadData()
} catch {
    print("Error after loading",error)
}

установить массив данных типа вашего класса Spot вместо словарного массива.

следующим образом: -

var dataArray = [Spot]()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...