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

通过UIButton访问随机音频对象数组:Question类answer属性访问错误排查

排查Question类answer属性访问错误的思路

嘿,我懂这种感觉——明明觉得逻辑都捋顺了,结果还是栽在某个小地方!针对你说的在checkAnswer函数里用questionNumber下标访问Question对象answer属性出错的问题,我给你梳理几个最常见的排查方向:

1. 先对齐基础代码场景

假设你的Question类和视图控制器里的核心代码大概是这样的:

// 你的Question类实现
class Question {
    let answer: Int
    
    init(answer: Int) {
        self.answer = answer
    }
}

// 视图控制器中的相关变量与方法
var questions = [Question]()
var questionNumber = 0 // 你设置的题目索引初始值

func checkAnswer() {
    // 此处使用questionNumber下标访问时出错
    let correctAnswer = questions[questionNumber].answer
    // ... 后续答案验证逻辑
}

如果是类似这样的结构,那大概率是下面几个问题之一:

2. 最容易踩的坑:下标越界

如果questionNumber的值超出了questions数组的有效索引范围(比如数组有3道题,索引是0、1、2,但questionNumber变成了3),就会直接触发崩溃。解决办法是先做合法性校验:

func checkAnswer() {
    // 先确保索引在数组的有效范围内
    guard questionNumber >= 0 && questionNumber < questions.count else {
        print("⚠️ 题目索引超出范围啦!当前数组共有\(questions.count)道题,你使用的索引是\(questionNumber)")
        return
    }
    let correctAnswer = questions[questionNumber].answer
    // 继续执行答案验证逻辑
}

3. questionNumber的更新/初始化逻辑出错

比如你一开始把questionNumber设成了1(但数组索引是从0开始的!),或者每次切换题目时没有正确控制索引的增减范围,导致下标始终不对。可以检查这两点:

  • 初始赋值:是不是应该从0开始?
  • 切换题目的代码:比如点击“下一题”时,是不是只写了questionNumber += 1但没判断是否超出数组长度?

4. 数组存储的是可选类型的Question实例

如果你的数组定义成了[Question?](可选类型数组),直接用questions[questionNumber].answer会因为没有安全解包而报错。这种情况需要先做解包处理:

func checkAnswer() {
    guard questionNumber < questions.count, let currentQuestion = questions[questionNumber] else {
        print("⚠️ 索引越界或者当前题目实例为空!")
        return
    }
    let correctAnswer = currentQuestion.answer
    // 执行答案验证逻辑
}

要是你能贴出具体的错误提示或者更多代码片段,我还能帮你更精准定位问题,但先从上面这几个方向排查,应该能解决大部分情况~

内容的提问来源于stack exchange,提问作者Terry B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:40:48