JSON mit SwiftUI unter Verwendung von Array
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
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()
}
}
}