JSON กับ SwiftUI โดยใช้ Array
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()
}
}
}
และไฟล์ struct ของฉันสำหรับ 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()
}
}
}