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"]
希望对您有所帮助。
@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"]
希望对您有所帮助。