Swift中JSON数据随机化问题——情侣问答APP开发遇阻
解决情侣提问APP的JSON随机化问题
错误原因分析
你的JSON数据是数组结构,但解码时错误使用了单个QuestionJSON类型,导致类型不匹配;同时缺少点击触发随机切换的交互逻辑。
修正步骤及完整代码
1. 修正View中的数据处理逻辑
修改test View代码,添加存储所有问题的变量,修正解码类型,并添加切换按钮:
struct test : View { // 存储所有问题数组 @State private var allQuestions: [QuestionJSON] = [] // 当前显示的问题 @State private var currentQuestion : QuestionJSON? var body: some View { VStack(spacing: 20) { if let question = currentQuestion { VStack(spacing: 10) { Text("问题 #\(question.questionNumber)") .font(.system(.title3)) .foregroundColor(.white) Text(question.question) .font(.system(.body)) .foregroundColor(.white) .multilineTextAlignment(.center) } .frame(width: 240, height: 180) .padding() .background(RoundedRectangle(cornerRadius: 7.0).fill(Color.blue)) } // 切换随机问题的按钮 Button(action: fetchRandomQuestion) { Text("换个问题") .font(.system(.title3)) .foregroundColor(.white) .padding() .background(RoundedRectangle(cornerRadius: 7).fill(Color.orange)) } } .onAppear { // 修正解码类型为数组 [QuestionJSON].self allQuestions = Bundle.main.decode([QuestionJSON].self, from: "data.json") // 初始化显示第一个随机问题 fetchRandomQuestion() } } // 抽取随机问题的方法 private func fetchRandomQuestion() { currentQuestion = allQuestions.randomElement() } }
2. 关键修改说明
- 修正解码类型:将
Bundle.main.decode(QuestionJSON.self, ...)改为Bundle.main.decode([QuestionJSON].self, ...),匹配JSON的数组结构。 - 存储问题数组:添加
@State private var allQuestions: [QuestionJSON] = [],避免每次点击都重新读取解码JSON,提升性能。 - 提取随机方法:封装
fetchRandomQuestion()方法,统一处理随机逻辑,方便在onAppear和按钮点击时复用。 - 添加交互按钮:新增按钮绑定
fetchRandomQuestion()方法,实现点击切换随机问题的需求。
错误提示解释
你遇到的Value of type 'QuestionJSON' has no member 'randomElement'错误,是因为解码得到的是单个QuestionJSON对象,而randomElement()是数组的专属方法,修正解码类型为数组后该错误会消失。
内容的提问来源于stack exchange,提问作者marcel maciaszek
相关产品推荐
相关产品推荐

