【问题标题】:Xcode Quiz look-a-like app with question and answer带有问题和答案的 Xcode Quiz 外观类似的应用程序
【发布时间】:2020-05-13 12:15:30
【问题描述】:

我正在尝试创建一个类似于测验的应用程序,其中拿着电话的人提出问题,其他人回答。所以会有两个字符串。一个有问题,一个有答案。我创建了这样的问题:

var questions = ["Question1", "Question2", "Question3", "Question4", "Question5"]
var answers = ["Answer1", "Answer2", "Answer3", "Answer4", "Answer5"]

当点击一个按钮时,会弹出一个正确答案的新问题。我知道如何显示问题中的随机字符串,但如何连接它以显示正确答案?

【问题讨论】:

    标签: arrays swift random


    【解决方案1】:

    另一种选择是使用Dictionary,问题为Key,答案为Value

    let questions: [String : String] = [
        "Question1" : "Answer1",
        "Question2" : "Answer2",
        "Question3" : "Answer3",
        "Question4" : "Answer4",
        "Question5" : "Answer5"
    ]
    

    然后您可以像这样获得随机问答:

    let randomQuestion = questions.randomElement()
    

    然后访问问答文本:

    let questionText = randomQuestion?.key ?? ""
    let answerText = randomQuestion?.value ?? ""
    

    关于您的下一个问题: 如何确保同一个问题不会出现多次,以及何时不再出现问题

    您可以像这样从Dictionary Keys 构造一个Array。无论如何,这些键都是无序的,但如果你想重复,你应该把它们洗牌。 然后,您可以遍历随机数组中的每个问题:

    viewDidLoad 中设置您的属性,而不是在点击按钮时。

    let randomQuestions = questions.keys.shuffled()
    var currentQuestionIndex = 0
    
    @IBAction func newQuestionButton(_ sender: Any) {
        guard currentQuestionIndex != questions.count else {
            return
            // or reset your questionIndex and reshuffle.
        }
    
        // This will give you the Question (and Key)
        let question = randomQuestions[currentQuestionIndex]
    
        // Use the Key to extract out the answer (value) from the Dictionary
        let answer = questions[question] ?? ""
    
        // Update your labels
        questionLabel.text = question
        answerLabel.text = answer
    
        // Increment your question index
        currentQuestionIndex += 1
    }
    

    【讨论】:

    • 非常好!一个问题:如何确保同一个问题不会出现多次,并且当没有更多问题时,questionLabel 会显示:“No more questions”?
    • 我做错了吗?看这里:pastebin.com/VuMPxT5S - 它多次显示相同的问题和答案,并且在显示所有问题时不会停止。
    • 那是因为每次按下按钮时您都在运行整个循环。我只是以循环为例。当前问题的变量必须从 0 开始,然后在每次点击新问题按钮时递增,以确保不超过问题库的计数。
    • 哦,所以我不应该为此使用循环?循环不是最好的选择吗?
    • 我已经为你更新了我的答案,但这远远超出了你的问题范围,我已经回答了。
    【解决方案2】:

    您可以简单地将zipquestionsanswers 一起调用,然后在结果上调用randomElement。这会给你一个 Tuple 包含一个随机问题及其各自的答案 - 假设 questionsanswers 的索引是同步的。

    var questions = ["Question1", "Question2", "Question3", "Question4", "Question5"]
    var answers = ["Answer1", "Answer2", "Answer3", "Answer4", "Answer5"]
    let questionsAndAnswers = Array(zip(questions, answers))
    
    let randomQA = questionsAndAnswers.randomElement()
    

    【讨论】:

    • 不错!但是如何将问题添加到 questionLabel,并从Tuple 回答 answerLabel?
    • @Conrooo 只做questionLabel.text = randomQA?.0answerLabel.text = randomQA?.1
    【解决方案3】:

    你可以创建一个QuizItem 类型。由于您总是需要将它们放在一起,因此最好将它们放在一个元素中,而不是使用两个数组。

    struct QuizItem {
      var question: String
      var answer: String
    }
    

    然后您创建并排列(或列出)[QuizItem] 并添加您想要的所有项目。最后,您只需获取数组的随机元素。 这是一些伪代码:

    var quizList = [QuizItem]()
    quizList.append(...) // add questions & answers
    
    let randomIndex = randomIndex between 0 and quizList.length-1
    let item = quizList[randomIndex]
    
    questionLable.text = item.question
    answereLabel.text = item.answere
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多