Разобрать JSON Результат для UILabel в Swift - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в быстром и в настоящее время изучаю API, выполняя проект, который показывает список игр из rawg.io со ссылкой на do c. Я создал GameFeed.swift и GameDetail.swift, чтобы извлечь из него имя, дату выпуска и рейтинг, и отлично работает на моей консоли.

GameFeed.swift:

struct GameFeed: Codable {
    let results:[GameDetail]
}

GameDetail.swift:

struct GameDetail: Codable {
    let name:String
    let released:String
    let rating:Double
}

Result in Console

Now i'm trying to put the results to a simple UIlabel like gameName.text, gameReleased.text & gameRating.text from ViewController.swift so it will be show in Main.Storyboard

введите описание изображения здесь

Я исследовал в Google, как показать его этим UIlabel с помощью DispatchQueue.main.async, но когда я объявляю его, он получает ошибку:

Значение типа GameFeed не имеет элемента name

такие же сообщения об ошибках также произошли с released и rating. Это мой ViewController.Swift:

class ViewController: UIViewController {
    @IBOutlet weak var gameName: UILabel!
    @IBOutlet weak var gameReleased: UILabel!
    @IBOutlet weak var gameRating: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Defining API Site
        let urlString = "https://api.rawg.io/api/games"
            let url = URL(string: urlString)
                guard url != nil else {
            return
        }
        
        // Calling API
        let session = URLSession.shared
            let dataTask = session.dataTask(with: url!){
                (data, response, error) in
            
                    if error == nil && data != nil {
                        let decoder = JSONDecoder()
                        do {
                            let gameFeed = try decoder.decode(GameFeed.self, from: data!)
                            print(gameFeed)
                            DispatchQueue.main.async {
                                self.gameName.text = gameFeed.name
                                self.gameReleased.text = gameFeed.released
                                self.gameRating.text = gameFeed.rating
                           }
                }
                        catch {
                            print("Error Parsing JSON")
                }
        }
        }
        dataTask.resume()
    }
}

Что мне делать, чтобы можно было разобрать данные на метки?

1 Ответ

1 голос
/ 05 августа 2020

GameFeed содержит Массив из GameDetail s. Но вы пытаетесь установить на этих этикетках один GameDetail. Сначала вы должны извлечь один GameDetail из этого массива, а затем назначить его так, как вам нравится.

DispatchQueue.main.async {
    let gameDetail = gameFeed.results.first // <- This will return the first one
    self.gameName.text = gameDetail?.name
    self.gameReleased.text = gameDetail?.released
    self.gameRating.text = gameDetail?.rating
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...