JSON con SwiftUI utilizzando Array
Sep 17 2020
Sono nuovo di SwiftUI e prima usavo solo UIKit. Ho provato a utilizzare JSON per mostrare un titolo ma tutti i video tutorial funzionano con gli elenchi. Non voglio utilizzare alcun elenco con JSON che mostra tutti i dati. Voglio solo recuperare ad esempio il secondo o un array specifico per il titolo.
Come posso rimuovere l'elenco in SwiftUI? La mia opinione:
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()
}
}
Responsabile del network:
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()
}
}
}
E i miei file struct per 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
}
Risposte
1 pawello2222 Sep 17 2020 at 23:38
Non voglio utilizzare alcun elenco con JSON che mostra tutti i dati. Voglio solo recuperare ad esempio il secondo o un array specifico per il titolo.
È possibile utilizzare una proprietà calcolata per accedere all'elemento specifico (e al suo titolo) postsdall'array:
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()
}
}
}