Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Swift Index Out of Range after API call

I’m trying to fetch some data from an API, however an Index out of range error is returning probably because I am trying to access the array before they are populated.

I have tried many ways but I am still getting the same error, can anyone suggest some solutions?

Here’s the code for fetching the data and populating the array to display them inside the TableView cells

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

@IBOutlet weak var tableView: UITableView!
    
    var teamsArray = [String]()
    var pointsArray = [String]()
    var winsArray = [String]()
    var drawsArray = [String]()
    var deafeatsArray = [String]()
    var gamesPlayedArray = [String]()
    var urlArray = [String]()

    
    var footballManager = FootballManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        footballManager.delegate = self
        footballManager.performRequest()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UINib(nibName: "StandingsCell", bundle: nil), forCellReuseIdentifier: "standingsCell")
    }
}


//MARK: - FootballManagerDelegate

extension ViewController: FootballManagerDelegate {
    func didUpdateStandings(_ footballManager: FootballManager, standings: FootballModel) {
        DispatchQueue.main.async {
            //self.clubsArray = standings.clubName
            self.populateArray(standings: standings)
            self.tableView.reloadData()
        }
    }
    func didFailWithError(error: Error) {
        print(error)
    }
    
    func populateArray(standings: FootballModel){
        for i in 0..<1 {
            for j in 0...standings.clubName[0].count-1 {
                self.teamsArray.append(standings.clubName[i][j].team.name)
                self.pointsArray.append(String(standings.clubName[i][j].points))
                self.gamesPlayedArray.append(String(standings.clubName[i][j].all.played))
                self.drawsArray.append(String(standings.clubName[i][j].all.draw))
                self.winsArray.append(String(standings.clubName[i][j].all.win))
                self.deafeatsArray.append(String(standings.clubName[i][j].all.lose))
                self.urlArray.append(String(standings.clubName[i][j].team.logo))
            }
        }
    }
}

//MARK: - UITabelViewDelegate

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "standingsCell", for: indexPath) as! StandingsCell
        cell.clubLogo.load(url: URL(string: urlArray[indexPath.row])!)
        cell.label1.text = teamsArray[indexPath.row]
        cell.label2.text = gamesPlayedArray[indexPath.row]
        cell.label3.text = winsArray[indexPath.row]
        cell.label4.text = drawsArray[indexPath.row]
        cell.label5.text = deafeatsArray[indexPath.row]
        cell.label6.text = pointsArray[indexPath.row]
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20;
    }
}

>Solution :

You need to change numberOfRowsInSection to reflect current size of the array ,also you need to use one array instead of multiple data source arrays

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

Warning: here i assume that all arrays are of the same size

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading