Swift 4 - фатальная ошибка: индекс вне диапазона - PullRequest
0 голосов
/ 20 мая 2018

Мне нужна помощь для завершения моего кода в Swift 4: я хочу перетасовать свой массив вопросов, но он всегда вылетает через один раз и показывает следующее сообщение:

"Неустранимая ошибка: Индекс изrange ".

Вот мой код:

class ThirdViewController: UIViewController {
    var questions = ["A", "B", "C", "D", "E"]
    var answers = [["1","2","3"],["2","1","3"],["3","2","1"],["1","3","2"],["2","3","1"]]

    // Variables
    var rightAnswerPlacement:UInt32 = 0
    var shuffled = [String]();
    let randomNumber = Int(arc4random() % 5)

    // Label Question
    @IBOutlet weak var Label: UILabel!

    // Buttons
    @IBAction func Button(_ sender: UIButton) {
        if (sender.tag == Int(rightAnswerPlacement)) {
            print ("RIGHT")
            newQuestion()
        }
        else {
            print ("WRONG")
            newQuestion()
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        self.navigationController?.isNavigationBarHidden = true
        newQuestion()
    }

    // Functions
    func newQuestion() {
        Label.text = questions[randomNumber]   // ----------> Fatal error: Index out of range !!! -------------------------------------------------------------
        rightAnswerPlacement = arc4random_uniform(3)+1

        for _ in 0..<questions.count {
            let randomNumber = Int(arc4random_uniform(UInt32(questions.count)))
            shuffled.append(questions[randomNumber])
            questions.remove(at: randomNumber)
        }

    // Create a Button
    var Button:UIButton = UIButton()
    var x = 1
    for i in 1...3 {
        Button = view.viewWithTag(i) as! UIButton
        if (i == Int(rightAnswerPlacement)) {
            Button.setTitle(answers[randomNumber][0], for: .normal)
        }
        else {
            Button.setTitle(answers[randomNumber][x], for: .normal)
            x = 2
        }
    }
}

Кажется, есть проблема с моей переменной randomNumber, но я не понимаю, как это исправить.Я видел подобные вопросы на форуме, но не получил ответа, который решает мою проблему.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Проблема в том, что когда вы удаляете элемент массива во время прохождения через тот же массив в цикле for, значение array.count уменьшается, и вы неизбежно получаете ошибку index out of range.

Распространенным решением этой проблемы является прохождение массива от конца к началу с использованием функции reversed() CountableRange:

for _ in (0..<questions.count).reversed(){

    //YOUR CODE
}
0 голосов
/ 20 мая 2018

arc4random () возвращает случайное число в диапазоне от 0 до 4 294 967 295

drand48 () возвращает случайное число в диапазоне от 0,0 до 1,0

arc4random_uniform (N)возвращает случайное число в диапазоне от 0 до N - 1

попробуйте let randomNumber = Int (arc4random_uniform (5))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...