Swift iOS问答App如何实现仅加载指定类别的题目?
指定类别题目加载实现方案
一、修改QData结构体(核心逻辑调整)
添加类别筛选属性,重构随机题目获取逻辑,适配类别过滤后的索引存储:
struct QData { let questions = [ Question(category: "Cat1", currentquestion: "What is 1+1?", answers: ["1", "2", "3", "4"], correctAnswerIndex: 1), Question(category: "Cat1", currentquestion: "What is 2+1?", answers: ["1", "6", "3", "5"], correctAnswerIndex: 2), Question(category: "Cat2", currentquestion: "What is 0?", answers: ["1", "3", "2", "0"], correctAnswerIndex: 3) ] // 存储当前选中的类别,传nil则恢复加载所有类别 var selectedCategory: String? = nil // 存储过滤后题目列表的索引(替代原数组索引,避免混乱) var previouslyUsedIndices: [Int] = [] mutating func getRandomQuestion() -> Question? { // 1. 根据选中类别过滤题目 let filteredQuestions: [Question] if let targetCategory = selectedCategory { filteredQuestions = questions.filter { $0.category == targetCategory } } else { filteredQuestions = questions } // 空判断:没有符合条件的题目直接返回nil guard !filteredQuestions.isEmpty else { return nil } // 2. 重置已使用索引(所有题目都轮过一遍后清空) if previouslyUsedIndices.count == filteredQuestions.count { previouslyUsedIndices = [] } // 3. 生成未使用过的随机索引 var randomIndex = GKRandomSource.sharedRandom().nextInt(upperBound: filteredQuestions.count) while previouslyUsedIndices.contains(randomIndex) { randomIndex = GKRandomSource.sharedRandom().nextInt(upperBound: filteredQuestions.count) } previouslyUsedIndices.append(randomIndex) return filteredQuestions[randomIndex] } // 便捷方法:切换类别时重置已用索引,避免残留旧数据 mutating func resetForCategory(_ category: String?) { selectedCategory = category previouslyUsedIndices = [] } }
二、更新displayQuestion方法(适配类别筛选后的展示)
调整题目计数逻辑,并处理无可用题目的边界情况:
func displayQuestion() { // 示例:用户选择类别后调用(比如从按钮、弹窗选择后触发) // questions.resetForCategory("Cat1") // 加载Cat1的题目 // questions.resetForCategory("Cat2") // 加载Cat2的题目 // questions.resetForCategory(nil) // 恢复加载所有类别 currentQuestion = questions.getRandomQuestion() if let question = currentQuestion { let choices = question.getChoices() questionLabel.text = question.getCurrentquestion() answer1Button.setTitle(choices[0], for: .normal) answer2Button.setTitle(choices[1], for: .normal) answer3Button.setTitle(choices[2], for: .normal) answer4Button.setTitle(choices[3], for: .normal) print(question.category) // 计算当前类别的总题目数,更新计数标签 let totalQuestions: Int if let category = questions.selectedCategory { totalQuestions = questions.questions.filter { $0.category == category }.count } else { totalQuestions = questions.questions.count } countLabel.text = "Question \(score.getQuestionsAsked()+1) / \(totalQuestions)" // 确保按钮可见(之前无题目时可能隐藏过) answer1Button.isHidden = false answer2Button.isHidden = false answer3Button.isHidden = false answer4Button.isHidden = false } else { // 无可用题目时的提示处理 questionLabel.text = "该类别暂无题目" countLabel.text = "Question 0 / 0" answer1Button.isHidden = true answer2Button.isHidden = true answer3Button.isHidden = true answer4Button.isHidden = true } }
三、使用方式
当用户在界面选择指定类别时(比如点击分类按钮),调用resetForCategory方法切换类别,再调用displayQuestion即可加载对应类别的题目:
// 用户点击Cat1按钮时触发 questions.resetForCategory("Cat1") displayQuestion()
内容的提问来源于stack exchange,提问作者Dragounow
相关产品推荐
相关产品推荐

