通过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
相关产品推荐
相关产品推荐

