Riempire una Table da JSON in SwiftUI

Mattepuffo's logo
Riempire una Table da JSON in SwiftUI

Riempire una Table da JSON in SwiftUI

In questo articolo vediamo come creare una Table in SwiftUI e riempirla con dati presi da un JSON remoto.

Siamo su macOS ovviamente, non su iOS.

Cominciamo con Book.swift che rappresenta la  nostra struttura dati:

import Foundation

struct BookList: Decodable {
    let books : [Book]
}

struct Book: Decodable, Identifiable {
    
    public var id: Int
    public var title: String
    public var isbn: String
    
    enum CodingKeys: String, CodingKey {
        case id = "id"
        case title = "title"
        case isbn = "isbn"
    }
    
}

Poi abbiamo il nostro BookService.swift che esegue la richiesta all'API:

import Foundation

public class BookService: ObservableObject {
    
    @Published var books = [Book]()
    
    init() {
        load()
    }
    
    func load() {
        let url = URL(string: "https://www.mattepuffo.com/api/book/get.php")!
        
        URLSession.shared.dataTask(with: url) {
            (data, response, error) in
            do {
                if let d = data {
                    let decodedLists = JSONDecoder()
                    decodedLists.keyDecodingStrategy = .convertFromSnakeCase
                    let dec = try decodedLists.decode(BookList.self, from: d)
                    DispatchQueue.main.async {
                        self.books = dec.books
                    }
                } else {
                    print("Non ci sono libri")
                }
            } catch {
                print(error)
            }
            
        }.resume()
        
    }
}

Infine la nostra finestra:

import SwiftUI

struct ContentView: View {
    
    @ObservedObject var bookService = BookService()
    
    var body: some View {
        VStack {
            Table(bookService.books) {
                TableColumn("TITOLO", value: .title)
                TableColumn("ISBN", value: .isbn)
            }
        }
    }
    
}

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

Enjoy!


Condividi

Commentami!