You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:01:06