Swift 4 - 使用Struct - Major缺陷创建多项选择测验

时间:2018-04-21 22:32:51

标签: swift xcode struct

我正在使用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多个问题。我哪里出错了?是否有更简单的方法来插入我的所有问题?

谢谢。

1 个答案:

答案 0 :(得分:1)

依赖于插座集合中物品的排序通常不是一个好主意,因为这是很难验证的。虽然,如果订单随着时间的推移而变化,我会感到惊讶。

如何使用按钮的tag属性?进入故事板并将标记0分配给第一个答案按钮,将1标记为第二个答案按钮,并标记最后两个23

然后将你的循环改为:

for button in ButtonsCollection {
    button.setTitle(Questions[QNumber].Answers[button.tag], for: .normal)
}

这将确保无论您的按钮在插座集合中的顺序是什么,正确的答案都将分配给右侧按钮。