2016-03-17 3 views
0

Существует, вероятно, лучший способ этого приложения без повторения кода, как я сделалQuiz App с массивом без повторяющихся вопросов

Я пытаюсь создать другой вопрос с, что делает его повторить из массива. Но каждый раз, когда действие NextQuestion нажимает несколько раз, он дает мне один и тот же вопрос несколько раз, потом переходит к следующему, или в другое время он только нажимает, а затем переходит к следующему. Я знаю, что это лучший код, но я все еще участвую.

import UIKit 

class TestQuestionsVC: UIViewController { 

    @IBOutlet weak var SignImage: UIImageView! 

    @IBOutlet weak var AnswerBtn_A: MaterialButton! 

    @IBOutlet weak var AnswerBtn_B: MaterialButton! 

    @IBOutlet weak var AnswerBtn_C: MaterialButton! 

    @IBOutlet weak var AnswerBtn_D: MaterialButton! 

    var questionModel = QuestionModel() 

    var GuessQuestionNum = "" 
    var answer: String = "" 
    var btnLatter = "" 
    var previousNumber: UInt32? // used in randomNumber() 

    override func viewDidLoad() { 
     super.viewDidLoad() 


      for _ in 1...5 { 
         randomQuestion(queModel: questionModel) 

      } 


    } 


    func randomQuestion(queModel queModel:QuestionModel){ 

     let questions = queModel.questions 
     let randomIndex = Int(arc4random_uniform(UInt32(questions.count))) 

     answer = "\(questions[randomIndex].answers[questions[randomIndex].correctAnswerIndex])" 

     SignImage.image = questions[randomIndex].question 
     AnswerBtn_A.setTitle("\(questions[randomIndex].answers[0])", forState: .Normal) 
     AnswerBtn_B.setTitle("\(questions[randomIndex].answers[1])", forState: .Normal) 
     AnswerBtn_C.setTitle("\(questions[randomIndex].answers[2])", forState: .Normal) 
     AnswerBtn_D.setTitle("\(questions[randomIndex].answers[3])", forState: .Normal) 

     } 




    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func ActBtn_A(sender: AnyObject) { 

     GuessQuestionNum = (AnswerBtn_A.titleLabel?.text)! 
     if GuessQuestionNum == answer { 
      AnswerBtn_A.backgroundColor = GREEN_COLOR 
     } else { 
      AnswerBtn_A.backgroundColor = RED_COLOR 

     } 

      } 

    @IBAction func ActBtn_B(sender: AnyObject) { 
     GuessQuestionNum = (AnswerBtn_B.titleLabel?.text)! 
     if GuessQuestionNum == answer { 
      AnswerBtn_B.backgroundColor = GREEN_COLOR 
     } else { 
     AnswerBtn_B.backgroundColor = RED_COLOR 
     } 
    } 

    @IBAction func ActBtn_C(sender: AnyObject) { 
     GuessQuestionNum = (AnswerBtn_C.titleLabel?.text)! 

     if GuessQuestionNum == answer { 
      AnswerBtn_C.backgroundColor = GREEN_COLOR 
     } else { 
      AnswerBtn_C.backgroundColor = RED_COLOR 
     } 
    } 

    @IBAction func ActBtn_D(sender: AnyObject) { 
     GuessQuestionNum = (AnswerBtn_D.titleLabel?.text)! 

     if GuessQuestionNum == answer { 
      AnswerBtn_D.backgroundColor = GREEN_COLOR 
     } else { 
      AnswerBtn_D.backgroundColor = RED_COLOR 
     } 
    } 

    @IBAction func NextQuestion(sender: AnyObject) { 

     AnswerBtn_A.backgroundColor = BLUE_COLOR 
     AnswerBtn_B.backgroundColor = BLUE_COLOR 
     AnswerBtn_C.backgroundColor = BLUE_COLOR 
     AnswerBtn_D.backgroundColor = BLUE_COLOR 

     for _ in 1...5 { 
      randomQuestion(queModel: questionModel) 

     } 
    } 


    func randomQuestion(queModel:QuestionModel){ 

     let questions = queModel.questions 

     func randomNumber() -> UInt32 { 
      var randomNumber = arc4random_uniform(UInt32(questions.count)) 
      while previousNumber == randomNumber { 
       randomNumber = arc4random_uniform(UInt32(questions.count)) 
      } 
      previousNumber = randomNumber 
      return randomNumber 
     } 


     let randomIndex = Int((UInt32(randomNumber()))) 

     answer = "\(questions[randomIndex].answers[questions[randomIndex].correctAnswerIndex])" 
     SignImage.image = questions[randomIndex].question 
     AnswerBtn_A.setTitle("\(questions[randomIndex].answers[0])", forState: .Normal) 
     AnswerBtn_B.setTitle("\(questions[randomIndex].answers[1])", forState: .Normal) 
     AnswerBtn_C.setTitle("\(questions[randomIndex].answers[2])", forState: .Normal) 
     AnswerBtn_D.setTitle("\(questions[randomIndex].answers[3])", forState: .Normal) 

    } 

} 

ответ

0

Существует много способов справиться с этим. Мое предложение было бы создать массив вопросительных индексов. Случайно удалите объект из массива индексов и используйте его для извлечения вопроса. Пример кода:

import Foundation 


let array = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"] 
var indexes = [Int](); 

func randomItem() -> String 
{ 
    if indexes.count == 0 
    { 
    print("Filling indexes array") 
    indexes = (0...array.count-1).map{$0} 
    } 
    let randomIndex = Int(arc4random_uniform(UInt32(indexes.count))) 
    let anIndex = indexes.removeAtIndex(randomIndex) 
    return array[anIndex]; 
} 

for i in 1...20 
{ 
    print("random word = \(randomItem())") 
} 

Функция randomItem() записывается повторно заполнить массив индексов, когда он пуст, так что вы получите новый набор случайных вопросов.

Обратите внимание, что после повторного заполнения массива можно получить один и тот же вопрос сразу после того, как новый массив будет содержать все возможные индексы, включая последний использованный. Вам нужно добавить дополнительную логику, чтобы предотвратить этот случай.

Смежные вопросы