JSON mit SwiftUI unter Verwendung von Array

Sep 17 2020

Ich bin neu bei SwiftUI und habe bisher nur UIKit verwendet. Ich habe versucht, mit JSON einen Titel anzuzeigen, aber alle Tutorial-Videos funktionieren mit Listen. Ich möchte keine Liste mit JSON verwenden, die alle Daten anzeigt. Ich möchte zum Beispiel nur das zweite oder ein bestimmtes Array für den Titel abrufen.

Wie kann ich die Liste in SwiftUI entfernen? Meine Sicht:

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()
    }
}

Netzwerk Manager:

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()
        }
    }
}

Und meine Strukturdateien für 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
}

Antworten

1 pawello2222 Sep 17 2020 at 23:38

Ich möchte keine Liste mit JSON verwenden, die alle Daten anzeigt. Ich möchte zum Beispiel nur das zweite oder ein bestimmtes Array für den Titel abrufen.

Sie können eine berechnete Eigenschaft verwenden, um über das postsArray auf das bestimmte Element (und seinen Titel) zuzugreifen :

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()
        }
    }
}