не может отобразить API в UITableViewController. "[DriverStanding] не имеет члена Driver" - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь отобразить список драйверов из формулы API. Это будет отображаться на UITableViewController. Я программно отобразил UITableView, но, к сожалению, нет данных. Ошибка, которую я получаю, заключается в том, что я не могу получить имя и фамилию для отображения в UITableViewCell. Я использую протокол Codable для получения, который находится в Swift 4. Ниже приведен код, который у меня есть до сих пор.

struct F1Data: Codable {
    let mrData: MRData

    enum CodingKeys: String, CodingKey {
        case mrData = "MRData"
    }
}

struct MRData: Codable {
    let xmlns: String
    let series: String
    let url: String
    let limit, offset, total: String
    let standingsTable: StandingsTable

    enum CodingKeys: String, CodingKey {
        case xmlns, series, url, limit, offset, total
        case standingsTable = "StandingsTable"
    }
}

struct StandingsTable: Codable {
    let season: String
    let standingsLists: [StandingsList]

    enum CodingKeys: String, CodingKey {
        case season
        case standingsLists = "StandingsLists"
    }
}

struct StandingsList: Codable {
    let season, round: String
    let driverStandings: [DriverStanding]

    enum CodingKeys: String, CodingKey {
        case season, round
        case driverStandings = "DriverStandings"
    }
}

struct DriverStanding: Codable {
    let position, positionText, points, wins: String
    let driver: Driver
    let constructors: [Constructor]

    enum CodingKeys: String, CodingKey {
        case position, positionText, points, wins
        case driver = "Driver"
        case constructors = "Constructors"
    }
}

struct Constructor: Codable {
    let constructorId: String
    let url: String
    let name: String
    let nationality: String
}

struct Driver: Codable {
    let driverId: String
    let url: String
    let givenName, familyName, dateOfBirth, nationality: String
}

class f1TableViewController: UITableViewController {
    var champions = [F1Data]()

    override func viewDidLoad() {
        super.viewDidLoad()
        //        let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.title = "Champion Drivers"
        fetchJSON()
    }

    private func fetchJSON(){
        let jsonUrlString = "https://ergast.com/api/f1/1999/driverstandings.json"

        guard let url = URL(string: jsonUrlString) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, err) in
            DispatchQueue.main.async {
                if let err = err {
                    print("Failed to get data from url:", err)
                    return
                }

                guard let data = data else { return }
                do {
                    let decoder = JSONDecoder()
                    // Swift 4.1
                    decoder.keyDecodingStrategy = .convertFromSnakeCase
                    self.champions = try decoder.decode([F1Data].self, from: data)
                    self.tableView.reloadData()

                } catch {
                    print(error)
                }
            }
        }.resume()
    }

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cellId")

        let champion = champions[indexPath.row]
        cell.textLabel?.text = champion.mrData.standingsTable.standingsLists[0].driverStandings.Driver
        //cell.detailTextLabel?.text = String(course.numberOfLessons)
        return cell
    }
}

Я знаю, как перебирать массив и показывать данные в консоли. Он просто пытается показать это в ячейке таблицы.

let season = f1Data.mrData.standingsTable.season
let firstDriver =  f1Data.mrData.standingsTable.standingsLists[0].driverStandings
for driver in firstDriver {
    print("\(driver.driver.givenName) \(driver.driver.familyName)")
}

print(season)
...