2017-07-22 4 views
0

Mein folgender Code zeigt eine Frage und die zugehörige Antwort an, indem Sie ein Array von Schlüsseln und Werten aus einem Wörterbuch erstellen und sicherstellen, dass beide Arrays den gleichen Index haben, der gezogen wird. Nachdem jedoch eine Frage und ihre Antworten nach dem Zufallsprinzip ausgewählt wurden, möchte ich sie dauerhaft aus ihren jeweiligen Arrays entfernen, bis alle anderen Elemente im Array angezeigt wurden. Einfach ausgedrückt, wie kann ich sicherstellen, dass eine Frage und ein Satz von Antworten nicht erneut angezeigt werden, bis alle Elemente angezeigt werden oder bis der Benutzer eine falsche Antwort erhält? Ab jetzt stellt mein Code sicher, dass der gleiche Zufallsindex nicht zweimal hintereinander ausgewählt wird, wenn ich sicherstellen möchte, dass er überhaupt nicht zweimal angezeigt wird.Wie dauerhaft Element aus Array entfernen, nachdem es Index aufgerufen wird?

ist hier mein Code (SWIFT für iOS):

func randomQuestion() { 


    //random question 
    var questionList = Array(QADictionary.keys) 
    var rand = Int(arc4random_uniform(UInt32(questionList.count))) 
    questionLabel.text = questionList[rand] 




    //matching answers 
    var answerList = Array(QADictionary.values) 
    var choices = answerList[rand] 




     rightAnswerBox = arc4random_uniform(4)+1 

     //create button 
     var button:UIButton = UIButton() 
     var x = 1 



     for index in 1...4 
     { 

      button = view.viewWithTag(index) as! UIButton 

      if (index == Int(rightAnswerBox)) 
      { 
       button.setTitle(choices[0], for: .normal) 

      } 

      else { 
       button.setTitle(choices[x], for: .normal) 
       x += 1 

      } 

      func removePair() { 
       questionList.remove(at: rand) 
       answerList.remove(at: rand) 


      } 


      randomImage() 

     } 
    } 


let QADictionary = ["Who is Thor's brother?" : ["Atum", "Loki", "Red Norvell", "Kevin Masterson"], "What is the name of Thor's hammer?" : ["Mjolinr", "Uru", "Stormbreaker", "Thundara"], "Who is the father of Thor?" : ["Odin", "Sif", "Heimdall", "Balder"]] 

Antwort

1

Ihre questionList auf eine Eigenschaft des Viewcontroller verschieben, so dass es um von einem Anruf von randomQuestion zum nächsten bleibt. Lade es nur neu, wenn es leer ist.

Verwenden Sie das Wörterbuch, um die passenden Antworten zu finden, anstatt ein zweites Array zu verwenden.

var questionList = [String]() 

func randomQuestion() { 

    //if no more questions, reload the questionList 
    if questionList.isEmpty { 
     questionList = Array(QADictionary.keys) 
    } 

    var rand = Int(arc4random_uniform(UInt32(questionList.count))) 
    questionLabel.text = questionList[rand] 

    //matching answers 
    var choices = QADictionary[questionList[rand]]! 

    questionList.remove(at: rand) 

    rightAnswerBox = arc4random_uniform(4)+1 

    //create button 
    var button:UIButton = UIButton() 
    var x = 1 

    for index in 1...4 
    { 
     button = view.viewWithTag(index) as! UIButton 

     if (index == Int(rightAnswerBox)) 
     { 
      button.setTitle(choices[0], for: .normal) 

     } 
     else { 
      button.setTitle(choices[x], for: .normal) 
      x += 1 

     } 

     func removePair() { 
      questionList.remove(at: rand) 
     } 

     randomImage() 
    } 
} 
+0

Dieser Code reicht immer noch nicht für das aus, was ich erreichen möchte. Ich versuche sicherzustellen, sobald eine Frage aus dem Array gefragt wird, wird es nicht erneut gefragt –

+0

Haben Sie es versucht? Sie müssen sich möglicherweise dorthin bewegen, wo Sie 'questionList.remove (at: rand)' an der entsprechenden Stelle aufrufen. Möchten Sie die Frage sofort bei der Auswahl entfernen oder nur, wenn sie richtig ist? – vacawama

+0

Ja, als ich den Code geschrieben habe, wie du sagtest, habe ich einen Fehler unter dem passenden Antwortkommentar für die Auswahlvariable, die besagt: "Kann Wert von Nicht-Funktionstyp nicht aufrufen '[String: Array ]'" –

Verwandte Themen