Manu
Manu

Reputation: 65

Swift 4 - Quiz App Random Questions

I'm a beginner to Swift and generally Xcode. Thank you in advance for your time and help :)

I am doing a Quiz App, and I try to have random questions... I have a function to generate random numbers that I tried to apply in viewDidLoad()... unfortunately I can not guess how to use that information in his variable "var currentQuestion = 0"

This is the code:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    generateRandomNumber(0, 9, 10)
}

override func viewDidAppear(_ animated: Bool) {
    newQuestion()
}


// Quiz//

let questions = ["Q1","Q2","Q3","Q4","Q5"]

let answers = [["A","2","3"],["B","2","3"],["C","2","3"],["D","2","3"],["E","2","3"]]


//Variables
var currentQuestion = 0
var rightAnswerPlacement:UInt32 = 0


//Generate Random Numbers
func generateRandomNumber(_ from:Int, _ to:Int, _ qut:Int?) -> [Int] {
    var myRandomNumbers = [Int]() //All our generated numbers
    var numberOfNumbers = qut //How many numbers to generate

    let lower = UInt32(from) //Generate from this number..
    let higher = UInt32(to+1) //To this one

    if numberOfNumbers == nil || numberOfNumbers! > (to-from) + 1 {
        numberOfNumbers = (to-from) + 1
    }

    while myRandomNumbers.count != numberOfNumbers {
        let myNumber = arc4random_uniform(higher - lower) + lower

        if !myRandomNumbers.contains(Int(myNumber)) {
            myRandomNumbers.append(Int(myNumber))
        }
    }
    return myRandomNumbers
}


//Label
@IBOutlet weak var lbl: UILabel!


//Button
@IBAction func action(_ sender: AnyObject) {
    if (sender.tag == Int(rightAnswerPlacement)) {
        print ("RIGHT!")
    } else {
        print ("WRONG!!!!!!")
    }

    if (currentQuestion != questions.count) {
        newQuestion()
    } else {
    }
}

//Function that displays new question
func newQuestion() {
    lbl.text = questions[currentQuestion]

    rightAnswerPlacement = arc4random_uniform(3)+1

    //Create a button
    var button:UIButton = UIButton()

    var x = 1

    for i in 1...3 {
        //Create a button
        button = view.viewWithTag(i) as! UIButton

        if (i == Int(rightAnswerPlacement)) {
            button.setTitle(answers[currentQuestion][0], for: .normal)
        } else {
            button.setTitle(answers[currentQuestion][x], for: .normal)
            x = 2
        }
    }
    currentQuestion += 1
}

Any idea that how will be possible to resolve?

Upvotes: 0

Views: 2869

Answers (1)

Upholder Of Truth
Upholder Of Truth

Reputation: 4711

First you need to store the array of random questions that you generate (side note you appear to try to generate 10 random numbers but have only 5 questions).

Then instead of using the currentQuestion directly you use that to access the question in the array.

So change it to this:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    questionArray = generateRandomNumber(0, 9, 10)
}

override func viewDidAppear(_ animated: Bool) {
    newQuestion()
}


// Quiz//

let questions = ["Q1","Q2","Q3","Q4","Q5"]

let answers = [["A","2","3"],["B","2","3"],["C","2","3"],["D","2","3"],["E","2","3"]]


//Variables
var currentQuestion = 0
var rightAnswerPlacement:UInt32 = 0
var questionArray: [Int] = [] // Just an initial value


//Generate Random Numbers
func generateRandomNumber(_ from:Int, _ to:Int, _ qut:Int?) -> [Int] {
    var myRandomNumbers = [Int]() //All our generated numbers
    var numberOfNumbers = qut //How many numbers to generate

    let lower = UInt32(from) //Generate from this number..
    let higher = UInt32(to+1) //To this one

    if numberOfNumbers == nil || numberOfNumbers! > (to-from) + 1 {
        numberOfNumbers = (to-from) + 1
    }

    while myRandomNumbers.count != numberOfNumbers {
        let myNumber = arc4random_uniform(higher - lower) + lower

        if !myRandomNumbers.contains(Int(myNumber)) {
            myRandomNumbers.append(Int(myNumber))
        }
    }
    return myRandomNumbers
}


//Label
@IBOutlet weak var lbl: UILabel!


//Button
@IBAction func action(_ sender: AnyObject) {
    if (sender.tag == Int(rightAnswerPlacement)) {
        print ("RIGHT!")
    } else {
        print ("WRONG!!!!!!")
    }

    if (currentQuestion != questions.count) {
        newQuestion()
    } else {
    }
}

//Function that displays new question
func newQuestion() {
    lbl.text = questions[questionArray[currentQuestion]]

    rightAnswerPlacement = arc4random_uniform(3)+1

    //Create a button
    var button:UIButton = UIButton()

    var x = 1

    for i in 1...3 {
        //Create a button
        button = view.viewWithTag(i) as! UIButton

        if (i == Int(rightAnswerPlacement)) {
            button.setTitle(answers[questionArray[currentQuestion]][0], for: .normal)
        } else {
            button.setTitle(answers[questionArray[currentQuestion]][x], for: .normal)
            x = 2
        }
    }
    currentQuestion += 1
}

(I think the code is correct but I'm currently running some tests in Xcode so can't check. If there is a problem leave a comment.)

Upvotes: 1

Related Questions