在尝试将随机数组元素附加到新数组中时,出现错误“Thread 1:EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP,subcode=0x0)”。
调试日志显示“致命错误:索引超出范围”

//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.

randomSequenceGeneratoris 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)
    }
}

为了获得更好的理解,我尝试编写一个“团队制作”程序,其中球员自动分类为事件,但他们可以选择哪些事件他们想优先。
不过,每个事件只能有6个人,所以我的目标是选择现有的6位数组,选择一个随机的3个索引位置,并排除其他玩家。
只有当我向同一个项目提交6名以上的玩家时,我才会得到这个错误。
非常感谢您的帮助!

最佳答案

你永远不能说一个不存在的索引。如果你这样做,你会崩溃,就像你现在崩溃。
所以,你是说:

garudaLocations[randomGarudaPrioritiesIndex]

现在,我不知道garudaLocations是什么。但我可以肯定地告诉你,如果randomGarudaPrioritiesIndex不是garudaLocations内的现有索引,你将绝对崩溃。
因此,您可以通过记录(printrandomGarudaPrioritiesIndex来轻松调试它。
请记住,现有的最大指标不是garudaLocations[garudaLocations.count]。它是garudaLocations[garudaLocations.count-1]。所以比较一下randomGarudaPrioritiesIndexgarudaLocations.count-1。如果该值更大,则在将其用作garudaLocations上的索引时会崩溃。

10-04 20:49