Встраиваемый JSON в Swift - PullRequest
       53

Встраиваемый JSON в Swift

0 голосов
/ 01 апреля 2020

Я очень новичок в использовании swift и декодирования JSON. Я пытаюсь создать приложение типа pokedex и использую канал JSON для чтения.

Канал JSON:

[{
    "id": 1,
    "name": {
      "english": "Bulbasaur",
      "japanese": "フシギダネ",
      "chinese": "妙蛙种子",
      "french": "Bulbizarre"
    },
    "type": [
      "Grass",
      "Poison"
    ],
    "base": {
      "HP": 45,
      "Attack": 49,
      "Defense": 49,
      "Sp. Attack": 65,
      "Sp. Defense": 65,
      "Speed": 45
    }
  },

//More entries

]

Мой подход:

import SwiftUI
import Foundation
import Combine

struct ContentView: View {
    @ObservedObject var pokemonInfo = GetData()

    var body: some View {
        List(pokemonInfo.pokemon){
            pokemon in
            Text(pokemon.name.english)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Pokemon: Codable, Identifiable {
    public var id: Int
    public var name: Name
    public var type: [String]
    public var base: Base
}

struct Name: Codable {
    public var english: String
    public var japanese: String
    public var chinese: String
    public var french: String
}

struct Base: Codable {
    public var hp: Int
    public var attack: Int
    public var defense: Int
    public var sp_attack: Int
    public var sp_defense: Int
    public var speed: Int

    enum CodingKeys: String, CodingKey{
        case hp = "HP"
        case attack = "Attack"
        case defense = "Defense"
        case sp_attack = "Sp. Attack"
        case sp_defense = "Sp. Defense"
        case speed = "Speed"
    }
}

public class GetData: ObservableObject {
    @Published var pokemon = [Pokemon]()
    init(){
        load()
    }

    func load(){
        let dataUrl = URL(string: "https://raw.githubusercontent.com/fanzeyi/pokemon.json/master/pokedex.json")!
        let decoder = JSONDecoder()
        URLSession.shared.dataTask(with: dataUrl) {(data,response,error) in
            do {
                if let d = data {
                    let decodedLists = try decoder.decode([Pokemon].self, from: d)
                    DispatchQueue.main.async {
                        self.pokemon = decodedLists
                    }
                } else {
                    print("No Data")
                }
            } catch {
                print("Error")
            }
        }.resume()
    }
}

Когда я пытаюсь просто отобразить id каждого покемона в виде списка, каждый запись пуста, что наводит меня на мысль, что я где-то напутал при декодировании канала JSON.

...