Swift buttons hidden fatal error: Array index out of range

Swift buttons hidden fatal error: Array index out of range

 @IBAction func endTurn(sender: UIButton) {

    let index: Int = Int (arc4random_uniform(UInt32(coins.count)))
        var i = Int(arc4random_uniform((3)))
        for i; i < 3; i++ {

            coins[i].hidden = true
            coins.removeAtIndex(i)
            println(i)
        }
    }

我有21个硬币。它是按钮数组(@IBOutlet var coins:[UIButton]!)。当我按 "endTurn" 时,硬币隐藏了。但是当我有 3 个或更少的硬币时,我会收到致命错误(行:coins[i].hidden = true)。 我需要做什么? 谢谢...

这个循环:

for i; i < 3; i++ {
    coins[i].hidden = true
    coins.removeAtIndex(i) // <-- here
    println(i)
}

在每次迭代中你删除一个硬币。因此,当 arc4random_uniform returns 0 时,您总共最多可以删除 3 个硬币。当您还剩下 3 个(或更少)硬币时,您将 运行 绑定到索引超出范围问题。

您正在尝试访问超出范围的数组索引。因此,添加检查 i 在数组范围内应该可以防止崩溃。

if(i < coins.length) {
   coins[i].hidden = true
   coins.removeAtIndex(i)
}

具有 3 个元素 [0, 1, 2] 的数组从索引 0-2 开始(数组的第一个索引是 0)。

在遍历数组时从数组中删除是一个很大的禁忌,并且可能没有按照您的意愿进行。

var i = 0
var arr = ["1", "2", "3", "4", "5"]

for i; i < 3; i++ {
    arr.removeAtIndex(i)
}

print(arr)

打印 ["2", "4"] 因为如果你看一下代码,你会在索引 0 处删除,所以你的数组现在是 ["2", "3", "4"],然后你递增 i,并在索引 1 处删除。由于数组移位,索引1 是“3”,你跳过了“2”。

将此信息与其他答案结合使用

这是一个Array Concurrent Modification。而且很危险。

在迭代数组时,不应修改数组的 length。您最终可能会遇到这样一种情况,即您正在访问不再存在的索引处的元素。

让Swift用removeRange的方法为您解决问题。以下代码段应向您展示如何修复代码。

var animals = ["dog", "cat", "duck", "eagle", "cow"]
let from = 1
let to = 2
for i in from...to {
    println(i) // will print `1` and `2`
}
animals.removeRange(from...to) // -> ["dog", "eagle", "cow"]

希望对您有所帮助。