Array kullanan SwiftUI ile JSON

Sep 17 2020

SwiftUI'de yeniyim ve daha önce yalnızca UIKit kullandım. Bir başlık göstermek için JSON kullanmayı denedim, ancak tüm eğitim videoları listelerle çalışıyor. JSON ile tüm verileri gösteren herhangi bir liste kullanmak istemiyorum. Yalnızca başlık için örneğin ikinci veya belirli bir diziyi getirmek istersiniz.

SwiftUI'deki listeyi nasıl kaldırabilirim? Benim görüşüm:

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

Ağ yöneticisi:

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

Ve Json için struct dosyalarım:

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

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

Yanıtlar

1 pawello2222 Sep 17 2020 at 23:38

JSON ile tüm verileri gösteren herhangi bir liste kullanmak istemiyorum. Yalnızca başlık için örneğin ikinci veya belirli bir diziyi getirmek istersiniz.

Diziden belirli öğeye (ve onun başlığına) erişmek için hesaplanan bir özelliği kullanabilirsiniz posts:

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