Swift:在尝试追加随机数组元素时获取EXC_BAD_INSTRUCTION

时间:2016-09-23 00:15:03

标签: ios arrays swift random

我在尝试将随机数组元素附加到新数组时收到错误&#34;线程1:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0)&#34; 。< / p>

调试日志显示&#34;致命错误:索引超出范围&#34;

//If there are more than 6 players prioritizing the event, make a random choice. garudaLocations is an array containing the players who prioritized the event "Garuda".

    if garudaLocations.count > 6 {

        var finalGarudaPlayers : [Int] = []
        let getRandom = randomSequenceGenerator(1, max: garudaLocations.count) //Tell RNG how many numbers it has to pick from.
        var randomGarudaPrioritiesIndex = Int()
        for _ in 1...6 {
            randomGarudaPrioritiesIndex = getRandom() //Generate a random number.
            finalGarudaPlayers.append(garudaLocations[randomGarudaPrioritiesIndex]) //ERROR: Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP, subcode=0x0)
        }
        debugPrint(finalGarudaPlayers) //Print array with the final priority Garuda members.

randomSequenceGenerator is a function I got from here,它可以生成随机数。

 func randomSequenceGenerator(min: Int, max: Int) -> () -> Int {
    var numbers: [Int] = []
    return {
        if numbers.count == 0 {
            numbers = Array(min ... max)
        }

        let index = Int(arc4random_uniform(UInt32(numbers.count)))
        return numbers.removeAtIndex(index)
    }
}

为了更好地理解,我正在尝试写一个&#34;团队制作&#34;玩家自动分类到事件中的程序,但他们可以选择他们想要优先考虑的事件。

每个事件我只能有6个人,所以目标是采用现有的garudaLocations数组,选择一个随机的6 索引位置,并摆脱其余的播放器。

我在向同一事件提交超过6名玩家后才会收到错误。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

永远不会谈论不存在的索引。如果你这样做,你就会在现在崩溃时崩溃。

所以,你说的是:

garudaLocations[randomGarudaPrioritiesIndex]

现在,我不知道garudaLocations是什么。但我可以肯定地告诉你,如果randomGarudaPrioritiesIndex不是garudaLocations中的现有索引,那么你绝对会崩溃。

因此,您可以通过记录(printrandomGarudaPrioritiesIndex来轻松调试。

请记住,现有最大的索引不是garudaLocations[garudaLocations.count]。它是garudaLocations[garudaLocations.count-1]。因此,请将randomGarudaPrioritiesIndexgarudaLocations.count-1进行比较。如果它更大,则当您将其用作garudaLocations上的索引时会崩溃。