Swift 4 - Неустранимая ошибка: индекс вне диапазона

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

«Фатальная ошибка: индекс вне допустимого диапазона».

Вот мой код:

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, но я не понимаю, как это исправить. Я видел подобные вопросы на форуме, но нет ответа, который решает мою проблему.


person Jamie    schedule 20.05.2018    source источник
comment
Почему первый цикл for в вашем методе newQuestion удаляет все ваши вопросы?   -  person rmaddy    schedule 20.05.2018
comment
Я удалил его и добавил свои вопросы var в свою функцию newQuestion, чтобы она работала, но как я могу сделать, чтобы она не повторяла дважды один и тот же вопрос?   -  person Jamie    schedule 20.05.2018
comment
Возможный дубликат Индекс вне диапазона в Swift с помощью removeAtIndex   -  person picciano    schedule 20.05.2018
comment
Вы должны заменять элементы на месте, а не удалять. Это позволит избежать ошибки вне диапазона из-за изменения размера массива, а также будет более эффективным в вычислительном отношении.   -  person pjs    schedule 21.05.2018


Ответы (2)


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

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

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

    //YOUR CODE
}
person Elena    schedule 20.05.2018
comment
@ Джейми Рад это слышать. Если это работает для вас, пожалуйста, примите мой ответ. - person Elena; 22.05.2018
comment
Это не проблема в данном случае. Поскольку значение из CountableRange даже не используется, порядок не имеет значения. - person jaetzold; 24.09.2018

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

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

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

попробуйте позволить randomNumber = Int (arc4random_uniform (5))

person thierryH    schedule 20.05.2018