JSON với SwiftUI bằng Array

Sep 17 2020

Tôi mới sử dụng SwiftUI và chỉ sử dụng UIKit trước đây. Tôi đã cố gắng sử dụng JSON để hiển thị tiêu đề nhưng tất cả các video hướng dẫn đều hoạt động với danh sách. Tôi không muốn sử dụng bất kỳ danh sách nào có JSON hiển thị tất cả dữ liệu. Chỉ muốn tìm nạp ví dụ thứ hai hoặc một mảng cụ thể cho tiêu đề.

Làm cách nào để xóa danh sách trong SwiftUI? Chế độ xem của tôi:

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

NetworkManager:

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

Và các tệp cấu trúc của tôi cho 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
}

Trả lời

1 pawello2222 Sep 17 2020 at 23:38

Tôi không muốn sử dụng bất kỳ danh sách nào có JSON hiển thị tất cả dữ liệu. Chỉ muốn tìm nạp ví dụ thứ hai hoặc một mảng cụ thể cho tiêu đề.

Bạn có thể sử dụng thuộc tính được tính toán để truy cập phần tử cụ thể (và tiêu đề của nó) từ postsmảng:

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