Array를 사용하는 SwiftUI와 JSON

Sep 17 2020

저는 SwiftUI를 처음 사용했으며 이전에는 UIKit 만 사용했습니다. 제목을 표시하기 위해 JSON을 사용하려고했지만 모든 튜토리얼 비디오가 목록으로 작동합니다. 모든 데이터를 표시하는 JSON 목록을 사용하고 싶지 않습니다. 예를 들어 제목에 대한 두 번째 또는 특정 배열 만 가져오고 싶습니다.

SwiftUI에서 목록을 제거하려면 어떻게해야합니까? 내보기 :

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

그리고 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
}

답변

1 pawello2222 Sep 17 2020 at 23:38

모든 데이터를 표시하는 JSON 목록을 사용하고 싶지 않습니다. 예를 들어 제목에 대한 두 번째 또는 특정 배열 만 가져오고 싶습니다.

계산 된 속성을 사용하여 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()
        }
    }
}