JSON con SwiftUI usando Array

Sep 17 2020

Soy nuevo en SwiftUI y solo usé UIKit antes. Intenté usar JSON para mostrar un título, pero todos los videos tutoriales funcionan con listas. No quiero usar ninguna lista con JSON que muestre todos los datos. Solo desea buscar, por ejemplo, el segundo o una matriz específica para el título.

¿Cómo puedo eliminar la lista en SwiftUI? Mi vista:

struct ContentView: View {
    
    @ObservedObject var networkManager = NetworkManager()
    var body: some View {
            NavigationView {
            List(networkManager.posts) { post in
            HStack {
            Text(String(post.points))
            Text(post.title)
                    }}
            .navigationBarTitle("H4X0R NEWS")
        }
        .onAppear {
            self.networkManager.fetchData()
        }
    }
}

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

Gerente de Redes:

class NetworkManager: ObservableObject {
    
    @Published var posts = [Post]()
    
    func fetchData() {
        if let url = URL(string: "https://hn.algolia.com/api/v1/search?tags=front_page") {
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url) { (data, response, error) in
                if error == nil {
                    let decoder = JSONDecoder()
                    if let safeData = data {
                        do {
                            let results = try decoder.decode(Results.self, from: safeData)
                            DispatchQueue.main.async {
                                self.posts = results.hits
                            }
                        } catch {
                            print(error)
                        }
                    }
                }
            }
            task.resume()
        }
    }
}

Y mis archivos de estructura para Json:

struct Results: Decodable {
    let hits: [Post]
}

struct Post: Decodable, Identifiable {
    var id: String {
        return objectID
    }
    let objectID: String
    let points: Int
    let title: String
}

Respuestas

1 pawello2222 Sep 17 2020 at 23:38

No quiero usar ninguna lista con JSON que muestre todos los datos. Solo desea buscar, por ejemplo, el segundo o una matriz específica para el título.

Puede usar una propiedad calculada para acceder al elemento específico (y su título) desde la postsmatriz:

struct ContentView: View {
    @ObservedObject var networkManager = NetworkManager()

    // return the title of the second item in the `posts` array
    var title: String {
        guard networkManager.posts.count >= 2 else { 
            // decide what to do when data is not yet loaded or count is <= 1
            return "Loading..."
        }
        return networkManager.posts[1].title
    }

    var body: some View {
        NavigationView {
            Text(title)
                .navigationBarTitle("H4X0R NEWS")
        }
        .onAppear {
            self.networkManager.fetchData()
        }
    }
}