Swift开发Quiz App:如何从JSON API获取特定组答案?
解决Quiz App仅显示特定答案组的问题
问题场景
开发Quiz App时,从JSON API拉取所有答案组后,当前代码会展示全部数据,但需求是仅加载并显示特定组(例如包含"tonight"、"tomorrow"、"this week"、"this month"的第二组)。
实现思路
API返回的questiondata.data是字符串键对应的字典结构,每个键对应一组题目与答案。要获取指定组,直接通过目标组的键(如第二组对应键"2")从字典中取值即可,无需遍历所有组数据。
修改后的完整代码
核心修改集中在ContentView的UI展示逻辑,替换原遍历所有组的代码为直接获取指定组数据:
import Foundation import SwiftUI struct ContentView: View { @StateObject var model = DataManager() // 设定目标组的键,第二组对应键为"2" let targetGroupKey = "2" var body: some View { VStack { if let qData = model.response?.record.questiondata.data, let targetQuest = qData[targetGroupKey] { VStack(spacing: 12) { Text(targetQuest.question) .font(.title) .fontWeight(.semibold) Text(targetQuest.answer1.text) Text(targetQuest.answer2.text) Text(targetQuest.answer3.text) Text(targetQuest.answer4.text) } .padding() } else { Text("未找到指定组数据或加载失败") } } .task { await model.loadData() } } } @MainActor class DataManager: ObservableObject { @Published var response: APIResponse? = nil func loadData() async { if let url = URL(string: "https://api.jsonbin.io/v3/b/641f82dcace6f33a22fbec99") { do { let (data, _) = try await URLSession.shared.data(from: url) response = try JSONDecoder().decode(APIResponse.self, from: data) } catch { print(error) } } } } struct APIResponse: Codable { let record: Record let metadata: Metadata } struct Metadata: Codable { let id: String let metadataPrivate: Bool let createdAt: String enum CodingKeys: String, CodingKey { case id case metadataPrivate = "private" case createdAt } } struct Record: Codable { let questiondata: QuestionData } struct QuestionData: Codable { var data: [String : Quest] struct AnyKey: CodingKey { var stringValue: String var intValue: Int? init?(stringValue: String) { self.stringValue = stringValue } init?(intValue: Int) { return nil } } init(from decoder: Decoder) throws { self.data = [:] let container = try decoder.container(keyedBy: AnyKey.self) container.allKeys.forEach { key in if let theQuest = try? container.decode(Quest.self, forKey: key) { self.data[key.stringValue] = theQuest } } } } struct Quest: Codable { let question: String let answer1, answer2, answer3, answer4: Answer } struct Answer: Codable { let logo, text: String enum CodingKeys: String, CodingKey { case logo case text = "Text" } } struct ContentView_Preview: PreviewProvider { static var previews: some View { ContentView() } }
关键说明
- 新增
targetGroupKey常量,指定要加载的目标组键(第二组对应"2") - 直接从
qData字典中通过键获取对应Quest对象,省去遍历所有组的开销 - 添加容错处理,当指定组不存在或数据未加载完成时,显示提示文本
- 保留原有数据模型与网络请求逻辑,仅修改UI展示部分以符合需求
内容的提问来源于stack exchange,提问作者M. Overby
相关产品推荐
相关产品推荐

