我正在使用Swift中的struct
创建测验。在大多数情况下,一切功能/按预期工作。但是,经过一定数量的问题后,我的答案(只有第2和第4个答案)会切换位置。因此,第四个答案成为第二个答案,第二个答案成为更好的答案(在用户界面和我的代码中)。例如
这是我的结构:
struct Question {
var Question: String!
var Answers: [String]!
var CorrectAnswer: Int!
}
我的代码看起来像这样:
Questions = [(Question: "What colour is the sky?",
Answers: ["Pink", "Blue", "Gold", "Green"],
CorrectAnswer: 2)]
然而,问题和答案将在UI上显示 -
What colour is the sky?
A) Pink
B) Green
C) Gold
D) Blue
由于CorrectAnswer
等于2
,您必须选择Green
,否则您的问题就会出错。他们只能纠正这种情况的方法是将CorrectAnswer
更改为4
,因此它现在不遵循结构。
我做错了吗?
这是我的其余代码的样子:
var Questions = [Question]()
var QNumber = Int()
var answerNumber = Int()
func generateRandomQuestion() {
if Questions.count > 0 {
QNumber = 0
questionLabel.text = Questions[QNumber].Question
answerNumber = Questions[QNumber].CorrectAnswer
for i in 0..<ButtonsCollection.count {
ButtonsCollection[i].setTitle(Questions[QNumber].Answers[i], for: UIControlState.normal)
}
Questions.remove(at: QNumber)
}
else {
print("Done")
}
}
我不希望单独手动完成所有问题,以便在需要的地方进行测试和修改,因为如果是这样的话,我需要经过1000多个问题。我哪里出错了?是否有更简单的方法来插入我的所有问题?
谢谢。
答案 0 :(得分:1)
依赖于插座集合中物品的排序通常不是一个好主意,因为这是很难验证的。虽然,如果订单随着时间的推移而变化,我会感到惊讶。
如何使用按钮的tag
属性?进入故事板并将标记0
分配给第一个答案按钮,将1
标记为第二个答案按钮,并标记最后两个2
和3
。
然后将你的循环改为:
for button in ButtonsCollection {
button.setTitle(Questions[QNumber].Answers[button.tag], for: .normal)
}
这将确保无论您的按钮在插座集合中的顺序是什么,正确的答案都将分配给右侧按钮。